2012-03-31 31 views
0

私は何らかの種類のラッパー/クラスを作ろうとしましたが、GUIをtkinterでややシンプルにしました。私はこれが冗長であることを理解しています。コードをもっときれいにしたり小さくしたりすることはありませんが、私はそれをやり遂げることができたら挑戦したいと思っていました。ここに私のコードです。Pythonのカスタム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要素をスポーンすることができます。しかし、1つの要素、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)は(a)には何も、ちょうど空のTkinterのウィンドウが表示されないテキスト「オーバーライドテキスト」が二Bysicのインスタンスでラベルを示しています。

どのように表示されますか?なぜなら、createLabelVar関数はあるインスタンスでは動作しますが、他のインスタンスでは動作しないのですか?

ありがとうございます!

答えて

0

Tkinterは、Tkクラスの複数のインスタンスを持つようには設計されていません。 1つしか作成せず、実行するのは1つだけにしてくださいmainloop

複数のウィンドウが必要な場合は、Toplevelのインスタンスを作成する必要があります。

関連する問題