在tkinter中添加GUI以进行简单的模拟

时间:2013-08-26 09:34:24

标签: python-2.7 tkinter simpy

我在我的简化模拟中实现一些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?

1 个答案:

答案 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()