2016-03-30 15 views
0

Also mache ich eine Anwendung, die Notizen macht (ähnlich Windows Sticky Notes). Da ich mehrere Noten gleichzeitig anzeigen muss, habe ich eine Klasse verwendet, die von Thread erbt und auch ein tkinter-Fenster erstellt. Das Problem ist, dass meine Fenster nicht gleichzeitig öffnen. Die zweite öffnet sich, nachdem die erste geschlossen ist. Hier ist der Code. Was mache ich falsch? Gibt es eine andere Methode, die ich verwenden kann? [Für jetzt bin ich die Anzeige nur Notizen, die ich habe hart codiert.]Wie führe ich mehrere Tkinter-Fenster gleichzeitig in Python aus?

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() 
+0

Verwenden Sie ein 'Toplevel' Widget? –

Antwort

0

Statt Subklassifizieren Thread nur Toplevel Unterklasse, ein Top-Level in tkinter ist ein separates Fenster in der gleichen Anwendung, die wie genau klingt, was Sie versuchen zu erreichen:

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 

Beachten Sie, dass anstelle des Speicherns des Titels als Attribut können Sie self.title() aufrufen, um den aktuellen Titel des Fensters und self.title("new title") zu erhalten, um es zu ändern.

+0

Danke, das hat funktioniert! Danke für den Vorschlag über den Titel, ich bin ziemlich neu zu Python und ich verstand es sehr gut :) – Me95

+0

normalerweise mit einem Attribut namens Titel wäre in Ordnung, es war nur das einzige, was wirklich über Ihren Code ändern musste um es kompatibel mit der Unterklasse von 'Toplevel' –

+0

zu machen, wenn es nicht eine Menge von' str object is callable' Fehlern erzeugt hat, wenn ich es getestet habe, hätte ich es genau so belassen wie Sie es hatten. :) –

1

Wenn alles, was Sie brauchen mehrere Notizfenster ist dann nicht definitiv Fäden müssen. Tkinter ist in der Lage, Dutzende oder Hunderte geöffneter Fenster zu verwalten.

Erstellen Sie einfach Instanzen von Toplevel für jedes Fenster mit Ausnahme des Stammfensters. Hier ist ein etwas over-engineered Beispiel:

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() 
Verwandte Themen