Python自定义tkinter gui类/包装函数不适用于每个实例。

时间:2012-03-31 17:27:26

标签: python class user-interface object tkinter

我尝试制作某种包装器/类,使得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函数适用于一个实例但不适用于另一个实例?

提前致谢!

1 个答案:

答案 0 :(得分:0)

Tkinter并非设计为具有Tk类的多个实例。您必须只创建一个,并且只有一个mainloop正在运行。

如果您想要多个窗口,则需要创建Toplevel的实例。