我正在使用Tkinter on python 2.7.8
我有两个类,每个类都创建一个窗口。在Interface类中,创建了根窗口,并使用顶级函数调用第二个窗口。
根窗口有一个条目,第二个窗口只有一个标签,所以我想实时给出标签(在第二个窗口中)(根窗口)的条目,所以我不会#39 ; t想要点击按钮来提供文字。
我试过了:
from Tkinter import *
class Interface(Frame):
def __init__(self, fenetre, **kwargs):
Frame.__init__(self, fenetre, width=0, height=0, **kwargs)
self.pack(fill=BOTH)
self.textA = StringVar()
self.textE = Entry(self, textvariable=self.textA, width=30)
self.textE.pack()
self.getT = self.textA.get()
self.newWindow = Toplevel(fenetre)
self.app = Interface2(self.newWindow)
class Interface2(Frame):
def __init__(self, fenetre, **kwargs):
Frame.__init__(self, fenetre, width=0, height=0, **kwargs)
self.pack(fill=BOTH)
fenetre.geometry("700x700")
self.textInRealTime = Label(self, text=interface.getT) #NameError: global name 'interface' is not defined
self.textInRealTime.pack()
fenetre = Tk()
interface = Interface(fenetre)
interface.mainloop()
interface.destroy()
所以,在注释行的Interface2类中,我尝试了这个text=interface.getT
并得到了
NameError: global name 'interface' is not defined
我也尝试过此text=Interface.getT
并收到此错误#AttributeError: class Interface has no attribute 'getT'
如何实时将第一堂课进入第二堂课?
答案 0 :(得分:1)
@mhawke,谢谢你如何将变量传递给其他类!!所以 我做到了 !!使用简单的线程将文本实时传输到另一个窗口:) 这是代码:
from Tkinter import *
from threading import Thread
def updateA(textA, tempText):
while 1:
tempText.set(textA.get())
class Interface(Frame):
def __init__(self, fenetre, **kwargs):
Frame.__init__(self, fenetre, width=0, height=0, **kwargs)
self.pack(fill=BOTH)
self.textA = StringVar()
self.textE = Entry(self, textvariable=self.textA, width=30)
self.textE.pack()
self.newWindow = Toplevel(fenetre)
self.app = Interface2(self.newWindow, self.textA)
class Interface2(Frame):
def __init__(self, fenetre, textA, **kwargs):
Frame.__init__(self, fenetre, width=0, height=0, **kwargs)
self.pack(fill=BOTH)
fenetre.geometry("700x700")
self.tempText = StringVar()
self.textW = Label(self, textvariable=self.tempText)
self.textW.pack()
t = Thread(target=updateA, args=(textA,self.tempText))
t.start()
fenetre = Tk()
interface = Interface(fenetre)
interface.mainloop()
interface.destroy()
答案 1 :(得分:0)
将textA
StringVariable
从Interface
传递到Interface2.__init__()
,然后使用Label()
将其传递到textvariable
:
对相关StringVariable
的任何更改都会导致标签立即更新。这个答案中有一些信息https://stackoverflow.com/a/1918054/21945。这是一些有效的代码:
from Tkinter import *
class Interface(Frame):
def __init__(self, fenetre, **kwargs):
Frame.__init__(self, fenetre, width=0, height=0, **kwargs)
self.pack(fill=BOTH)
self.textA = StringVar()
self.textE = Entry(self, textvariable=self.textA, width=30)
self.textE.pack()
self.getT = self.textA.get()
self.newWindow = Toplevel(fenetre)
self.app = Interface2(self.newWindow, self.textA) # note extra StringVariable argument passed to Interface2 constructor
class Interface2(Frame):
def __init__(self, fenetre, textA, **kwargs): # note extra StringVariable parameter "textA"
Frame.__init__(self, fenetre, width=0, height=0, **kwargs)
self.pack(fill=BOTH)
fenetre.geometry("700x700")
self.textInRealTime = Label(self, textvariable=textA) # note textvariable set to StringVariable
self.textInRealTime.pack()
fenetre = Tk()
interface = Interface(fenetre)
interface.mainloop()
interface.destroy()