0

我在我的简单模拟中实现一些 GUI 时遇到问题。问题是如何将最好用 Tkinter 制作的 GUI 添加到一个简单的项目中。赖特现在我什至在创建一个窗口时遇到了问题。我认为这是因为当模拟停止运行时我无法执行 Tkinter 代码。我知道这是一个非常普遍的问题,但我不知道如何开始。我想用 Tkinter 做的是为我的模拟绘制一个拓扑,也许能够更改一些参数,并从 GUI 运行它。

我在模拟开始时添加了部分,并创建了对象,整个东西大了十倍以上,所以我不知道我是否应该在这里添加它。

initialize()

network=Network()


#creating  nodes

node=Node(name='node', function='user', interfaceNum=2, possition=[160,990], homeAddress='0000000000000000020000fffe111111')
node.engine.stateTable={'wifiassocresp':'self.changeIp(interface, self.HO)','dissconnect':'node.engine.dissconnect(self.interruptCause, self.interruptCause.passSender)','RngRsp':'self.sendBU()', 'MIPv6BindingAck_LCoA':'self.sendBU(RCoA=True)', 'MihN2nHoCandidateQueryRsp':'self.makeHandover()'}
activate(node, node.start())

ap0=Node(name='ap0', function='ap', interfaceNum=2,possition=[200,1000])
ap0.engine.stateTable={'dissconnect':'self.dissconnect(self.interruptCause, self.interruptCause.passSender)'}
activate(ap0, ap0.start())

 ..... there is more nodes, but i cut it becouse I thinks that this is not important


activate(ha, ha.start())

ha.engine.HAadresses={'node':{ 
    'interfaceAddress':[node.interfaceList[0], node.interfaceList[0].address],
    'homeAddress':[node.homeAddress],}}


simulation=Tasks()


network.drawTopology(nodes=[node, ap1,ap2, map1, ap0, internet, ha])


allNodes=[node, internet, ap1, ap2, map1, ap0, ha]
node.apList=[ap0,ap1,ap2]

ap1.engine.createRouting([node, internet, map1, ap0, ap2, ha])
ap2.engine.createRouting([node, internet, map1, ap0, ap1, ha])
map1.engine.createRouting([node, ap1, internet, ap0,ap2, ha])
ap0.engine.createRouting([node, ap1, ap2, map1, internet, ha])
internet.engine.createRouting([node, ap1, map1, ap0,ap2, ha])


#here starts the simulation
activate(simulation, simulation.run(1))

simulate(until=100000.0)

这是 mu GUI 的代码

from Tkinter import *
from betaruch import *

class MainWindow:
    def __init__(self, master):
        ramka=Frame(master)
        ramka.pack()

        self.przycisk=Button(ramka, text="Wyjscie", fg="red", command=ramka.quit)
        self.przycisk.pack(side=LEFT)

        self.witam=Button(ramka, text="Uruchom", command=self.uruchomSymulacje)
        self.witam.pack(side=LEFT)        

    def uruchomSymulacje(self):
        pass

root=Tk()

onko=MainWindow(root)


root.mainloop()

它不应该做任何事情,但它甚至没有出现。

好的,也许这会有所帮助。我注意到当我同时导入 Tkinter 和 matplotlib 时会出现问题。所以也许 matplotlib 也在使用 tkinter?

4

1 回答 1

1

看起来您正在betaruch与 Tkinter 代码在同一线程中执行模块的代码,这就是您的 GUI 无响应的原因。为了解决这个问题,您可以使用模块在新线程中执行模拟threading

import threading
from Tkinter import *
from betaruch import *

class MainWindow:
    # ...    

    def uruchomSymulacje(self):
        thread = threading.Thread(target=a_betaruch_function) # just a reference, without parentheses
        thread.start()
于 2013-08-26T10:55:17.730 回答