Ich schreibe ein Programm, das:
Ich verwende Klassen, damit ich den Code später in ein größeres Programm einfügen kann. Ich kann meine Tasten jedoch nicht richtig laden.
import tkinter as tk
class Demo1(tk.Frame):
def __init__(self):
tk.Frame.__init__(self)
self.pack()
self.master.title("Demo 1")
self.button1 = tk.Button(self, text = "Button 1", width = 25,
command = self.new_window)
self.button1.grid(row = 0, column = 1, columnspan = 2, sticky = tk.W+tk.E+tk.N+tk.S)
def new_window(self):
self.newWindow = Demo2()
class Demo2(tk.Frame):
def __init__(self):
new = tk.Frame.__init__(self)
new = tk.Toplevel(self)
new.title("Demo 2")
new.button = tk.Button(text = "Button 2", width = 25,
command = self.close_window)
new.button.pack()
def close_window(self):
self.destroy()
def main():
Demo1().mainloop()
if __== '__main__':
main()
Ich habe Ihren Code auf eine übersichtlichere und besser geübte Weise umgeschrieben:
import tkinter as tk
class Demo1:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window)
self.button1.pack()
self.frame.pack()
def new_window(self):
self.newWindow = tk.Toplevel(self.master)
self.app = Demo2(self.newWindow)
class Demo2:
def __init__(self, master):
self.master = master
self.frame = tk.Frame(self.master)
self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows)
self.quitButton.pack()
self.frame.pack()
def close_windows(self):
self.master.destroy()
def main():
root = tk.Tk()
app = Demo1(root)
root.mainloop()
if __== '__main__':
main()
Ergebnis:
Sie müssen den Master für die zweite Schaltfläche angeben. Sonst wird es in das erste Fenster gepackt. Dies wird nicht nur für Button
benötigt, sondern auch für andere Widgets und Nicht-GUI-Objekte wie StringVar
.
Quick fix: füge den Frame new
als erstes Argument zu deiner Button
in Demo2
hinzu.
Möglicherweise besser: Derzeit haben Sie Demo2
von tk.Frame
geerbt, aber ich denke, das macht mehr Sinn, wenn Sie Demo2
in etwas ändern,
class Demo2(tk.Toplevel):
def __init__(self):
tk.Toplevel.__init__(self)
self.title("Demo 2")
self.button = tk.Button(self, text="Button 2", # specified self as master
width=25, command=self.close_window)
self.button.pack()
def close_window(self):
self.destroy()
Nur als Vorschlag sollten Sie tkinter
nur einmal importieren. Wählen Sie eine der ersten beiden Importanweisungen aus.
#!/usr/bin/env python
import Tkinter as tk
from Tkinter import *
class windowclass():
def __init__(self,master):
self.master = master
self.frame = tk.Frame(master)
self.lbl = Label(master , text = "Label")
self.lbl.pack()
self.btn = Button(master , text = "Button" , command = self.command )
self.btn.pack()
self.frame.pack()
def command(self):
print 'Button is pressed!'
self.newWindow = tk.Toplevel(self.master)
self.app = windowclass1(self.newWindow)
class windowclass1():
def __init__(self , master):
self.master = master
self.frame = tk.Frame(master)
master.title("a")
self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25 , command = self.close_window)
self.quitButton.pack()
self.frame.pack()
def close_window(self):
self.master.destroy()
root = Tk()
root.title("window")
root.geometry("350x50")
cls = windowclass(root)
root.mainloop()
Sie könnten den Code aus tkinter.py
in eine Datei mit dem Namen mytkinter.py
kopieren und dann diesen Code ausführen:
import tkinter, mytkinter
root = tkinter.Tk()
window = mytkinter.Tk()
button = mytkinter.Button(window, text="Search", width = 7,
command=cmd)
button2 = tkinter.Button(root, text="Search", width = 7,
command=cmdtwo)
Und Sie haben zwei Fenster, die nicht zusammenstoßen!
Ich habe versucht, mit dem obigen Beispiel von Rushy Panchal mehr als zwei Fenster zu verwenden. Die Absicht war, die Änderung zu haben, um mehr Fenster mit verschiedenen Widgets in ihnen aufzurufen. Mit der neuen Funktion werden verschiedene Schaltflächen zum Öffnen verschiedener Fenster erstellt. Sie übergeben als Argument den Namen der Klasse, die das Fenster enthält (das zweite Argument ist nicht erforderlich, ich habe es nur dort abgelegt, um eine mögliche Verwendung zu testen. Es könnte interessant sein, die Widgets gemeinsam von einem anderen Fenster zu erben.
import tkinter as tk
class Demo1:
def __init__(self, master):
self.master = master
self.master.geometry("400x400")
self.frame = tk.Frame(self.master)
self.butnew("Window 1", "ONE", Demo2)
self.butnew("Window 2", "TWO", Demo3)
self.frame.pack()
def butnew(self, text, number, _class):
tk.Button(self.frame, text = text, width = 25, command = lambda: self.new_window(number, _class)).pack()
def new_window(self, number, _class):
self.newWindow = tk.Toplevel(self.master)
_class(self.newWindow, number)
class Demo2:
def __init__(self, master, number):
self.master = master
self.master.geometry("400x400+400+400")
self.frame = tk.Frame(self.master)
self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows)
self.label = tk.Label(master, text=f"this is window number {number}")
self.label.pack()
self.quitButton.pack()
self.frame.pack()
def close_windows(self):
self.master.destroy()
class Demo3:
def __init__(self, master, number):
self.master = master
self.master.geometry("400x400+400+400")
self.frame = tk.Frame(self.master)
self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows)
self.label = tk.Label(master, text=f"this is window number {number}")
self.label.pack()
self.label2 = tk.Label(master, text="THIS IS HERE TO DIFFERENTIATE THIS WINDOW")
self.label2.pack()
self.quitButton.pack()
self.frame.pack()
def close_windows(self):
self.master.destroy()
def main():
root = tk.Tk()
app = Demo1(root)
root.mainloop()
if __name__ == '__main__':
main()