Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中同时运行多个tkinter窗口?_Python_Multithreading_Tkinter - Fatal编程技术网

如何在Python中同时运行多个tkinter窗口?

如何在Python中同时运行多个tkinter窗口?,python,multithreading,tkinter,Python,Multithreading,Tkinter,因此,我正在制作一个记录笔记的应用程序(类似于Windows便笺)。因为我需要同时显示多个注释,所以我使用了一个从Thread继承并创建tkinter窗口的类。问题是我的窗口不能同时打开。第二个在第一个关闭后打开。这是代码。我做错了什么?还有别的方法可以用吗?[目前我只显示我硬编码的注释。] from tkinter import * from threading import Thread class Note(Thread): nid = 0 title = "" message = ""

因此,我正在制作一个记录笔记的应用程序(类似于Windows便笺)。因为我需要同时显示多个注释,所以我使用了一个从Thread继承并创建tkinter窗口的类。问题是我的窗口不能同时打开。第二个在第一个关闭后打开。这是代码。我做错了什么?还有别的方法可以用吗?[目前我只显示我硬编码的注释。]

from tkinter import *
from threading import Thread

class Note(Thread):
nid = 0
title = ""
message = ""

    def __init__(self, nid, title, message):
      Thread.__init__(self)
      self.nid = nid
      self.title = title
      self.message = message


    def display_note_gui(self): 
      '''Tkinter to create a note gui window with parameters '''    
      window = Tk()
      window.title(self.title)
      window.geometry("200x200")
      window.configure(background="#BAD0EF")

      title = Entry(relief=FLAT, bg="#BAD0EF", bd=0)
      title.pack(side=TOP)
      scrollBar = Scrollbar(window, takefocus=0, width=20)
      textArea = Text(window, height=4, width=1000, bg="#BAD0EF", font=("Times", "14"))
      scrollBar.pack(side=RIGHT, fill=Y)
      textArea.pack(side=LEFT, fill=Y)
      scrollBar.config(command=textArea.yview)
      textArea.config(yscrollcommand=scrollBar.set)
      textArea.insert(END, self.message)
      window.mainloop()

    def run(self):
      self.display_note_gui()

new_note1 = Note(0, "Hello", "Hi, how are you?")
new_note1.start()
new_note1.join()


new_note2 = Note(1, "2", "How's everyone else?")
new_note2.start()
new_note2.join()

如果您只需要多个便笺窗口,那么您肯定不需要线程。Tkinter能够管理数十个或数百个打开的窗口

只需为除根窗口外的每个窗口创建
Toplevel
的实例。这里有一个设计过度的例子:

import Tkinter as tk

class Notepad(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.text = tk.Text(self, wrap="word")
        self.vsb = tk.Scrollbar(self, orient="vertical", comman=self.text.yview)
        self.text.configure(yscrollcommand=self.vsb.set)
        self.vsb.pack(side="right", fill="y")
        self.text.pack(side="left", fill="both", expand=True)

def main():
    root = tk.Tk()
    Notepad(root).pack(fill="both", expand=True)
    for i in range(5):
        top = tk.Toplevel(root)
        Notepad(top).pack(fill="both", expand=True)

    root.mainloop()

if __name__ == "__main__":
    main()

tkinter中的顶层不是子类化
线程
而是子类化
顶层
,而是同一应用程序中的一个单独窗口,听起来与您正试图实现的完全相同:

from tkinter import *
#from threading import Thread #no longer needed

class Note(Toplevel):
    nid = 0
    #title = "" #this would block the method to override the current title
    message = ""

    def __init__(self, master, nid, title, message):
      Toplevel.__init__(self,master)
      self.nid = nid 
      self.title(title) #since toplevel widgets define a method called title you can't store it as an attribute
      self.message = message
      self.display_note_gui() #maybe just leave that code part of the __init__?


    def display_note_gui(self): 
      '''Tkinter to create a note gui window with parameters '''    
      #no window, just self
      self.geometry("200x200")
      self.configure(background="#BAD0EF")
      #pass self as the parent to all the child widgets instead of window
      title = Entry(self,relief=FLAT, bg="#BAD0EF", bd=0)
      title.pack(side=TOP)
      scrollBar = Scrollbar(self, takefocus=0, width=20)
      textArea = Text(self, height=4, width=1000, bg="#BAD0EF", font=("Times", "14"))
      scrollBar.pack(side=RIGHT, fill=Y)
      textArea.pack(side=LEFT, fill=Y)
      scrollBar.config(command=textArea.yview)
      textArea.config(yscrollcommand=scrollBar.set)
      textArea.insert(END, self.message)
      #self.mainloop() #leave this to the root window

    def run(self):
      self.display_note_gui()

root = Tk()
root.withdraw() #hide the root so that only the notes will be visible

new_note1 = Note(root, 0, "Hello", "Hi, how are you?")
#new_note1.start()
#new_note1.join()


new_note2 = Note(root, 1, "2", "How's everyone else?")
#new_note2.start()
#new_note2.join()

root.mainloop() #still call mainloop on the root

请注意,您可以调用
self.title()
获取窗口的当前标题,并
self.title(“新标题”)
对其进行更改,而不是将标题存储为属性。

使用
Toplevel
小部件?谢谢,这很有效!感谢您对标题的建议,我对python非常陌生,而且我对它非常了解:)通常使用名为
title
的属性就可以了,这是唯一真正需要对代码进行更改的事情,以使其与
Toplevel
的子类兼容,如果它没有引发一系列
str对象不可调用的错误,那么当我测试它时,我会完全保留它。:)我还有一个问题,你能帮我吗