2017-06-06 20 views
0

嗨我试图在tkinter中使用onplevel方法,它没有工作... 我应该写什么来打开两个窗口在不同的时间在两种方法,而有方法并行运行? 决定与接收方法并行运行的方法...代码卡在“window = Toplevel(root)”的接收方法中。当然它得到一个消息,但我不想溢出你们...我如何使用Toplevel方法?

from Tkinter import * 
import threading 


def decide_what(self): 

    global root 
    root = Tk() 

    root.title("options") 
    root.geometry("600x250") 
    root.resizable(width=FALSE, height=FALSE) # cant resize 

    self.label = Label(root, text='CHOOSE YOUR FIRST OPTION!', font=30) 
    self.label.place(x=200, y=13) 

    self.button1 = Button(root, text='PrivateChat', font=30, 
    command=self.private) 
    self.button1.place(x=1, y=50, width=200, height=199) 

    self.button2 = Button(root, text='GroupChat', font=30, 
    command=self.group) 
    self.button2.place(x=201, y=50, width=199, height=199) 

    self.button3 = Button(root, text='BroadCast', font=30, 
    command=self.broadcast) 
    self.button3.place(x=400, y=50, width=200, height=199) 

    self.button4 = Button(root, text='WAIT', font=30, command=self.wait) 
    self.button4.place(x=500, y=10) 

    root.mainloop() 


def receiving_message(self): # a function that responsible to receive a message from the server, **shes in a class** 

    print "receive??????????????????" 
    while True: 

     data = self.sock.recv(1024) 

     data = decryption(data) 
     print "data", data 

     if data[:2] == "Br": 

      print "got into br" 

      window = Toplevel(root) 
      print "window V" 

      window.title("BroadCastZone") 
      label = Label(window, text=data) 
      label.pack() 
      button = Button(window, text="ok", command=window.destroy) 
      button.pack() 

      print data 
+1

你确定你不会陷入无限循环吗? – acdr

+2

套接字侦听器应该可能在GUI中的单独线程或进程中运行。 'while True'语句是一个阻塞语句,这意味着它将阻止事件循环(root.mainloop)处理更新显示,创建窗口等事件。因此,您需要一个单独的侦听器线程与GUI进行通信,从而离开GUI可用于格式化和显示结果。 –

+0

但它在一个单独的线程... GUI和套接字不碰撞 – shahar

回答

1

所有tkinter代码需要运行在同一个线程。如果receiving_message正在单独的线程中运行,则无法创建Toplevel的实例。它需要发送消息给主线程并要求它打开一个窗口。

+0

因此,如果我必须这样做,线程中的新窗口更好? – shahar