我在我的简化模拟中实现一些GUI时遇到了问题。问题是如何将GUI(最好是在Tkinter中制作)添加到一个简单的项目中。 Wright现在我甚至有创建窗口的问题。我认为这是因为当模拟停止运行时我无法解释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?
答案 0 :(得分:1)
看起来您在与Tkinter代码相同的线程中执行betaruch
模块的代码,因此这就是您的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()