我尝试制作某种包装器/类,使得tkinter的GUI更简单一些。我意识到这是多余的,它不会使代码更漂亮或更小,但我只是想尝试,如果我能做到这一点。这是我的代码。
#!/usr/bin/env
from tkinter import *
import tkinter.messagebox
class Bysic():
def __init__(self):
self.app = Tk()
def createButton(self, label, row, col, command, sticky=W):
self.button = Button(self.app,text=label,command=command)
self.button.grid(row=row, column=col, sticky=sticky)
def setSize(self, width, height):
self.app.geometry(str(width)+"x"+str(height))
def setTitle(self, title):
self.app.title(title)
def createEntry(self, caption, row, col, width=None, defaultValue=None, alignment=W, **options):
self.entryLabel = Label(self.app, text=caption)
self.entryLabel.grid(row=row, column=col, sticky=W)
self.entry = Entry(self.app, **options)
if defaultValue:
self.entry.delete(0, END)
self.entry.insert(0, defaultValue)
if width:
self.entry.config(width=width)
self.entry.grid(row=row, column=col+1, sticky=W)
return self.entry
def createLabelVar(self, caption, row, col, alignment=W):
self.labelVar = StringVar()
self.labelVar.set(caption)
self.label = Label(self.app, textvar=self.labelVar)
self.label.grid(row=row, column=col, sticky=alignment)
return self.labelVar
def createLabel(self, caption, row, col, alignment=W):
self.staticLabel = Label(self.app, text=caption)
self.staticLabel.grid(row=row, column=col, sticky=alignment)
def appLoop(self):
self.app.mainloop()
def appKill(self):
self.app.destroy()
我现在可以实例化一个'Bysic'对象并在其上生成GUI元素。但是有一个元素,createLabelVar只适用于第一个gui。让我来证明这一点。
import bysic
x = Bysic()
label = x.createLabelVar("Original text",0,0)
label.set("Overriding text")
a = Bysic()
newLabel = a.createLabelVar("Original text",0,0)
newLabel.set("Override")
第一个Bysic实例(x)确实显示带有文本“Overriding text”的标签,但是第二个Bysic实例(a)没有显示任何内容,只是一个空的tkinter窗口。
怎么来的?我的意思是,x和a是分开的,为什么createLabelVar函数适用于一个实例但不适用于另一个实例?
提前致谢!
答案 0 :(得分:0)
Tkinter并非设计为具有Tk
类的多个实例。您必须只创建一个,并且只有一个mainloop
正在运行。
如果您想要多个窗口,则需要创建Toplevel
的实例。