【问题标题】:Get Entry text in another class在另一个类中获取条目文本
【发布时间】:2023-03-08 12:21:01
【问题描述】:

我正在与Tkinter on python 2.7.8合作

我有两个类,每个类都创建一个窗口。在 Interface 类中创建根窗口并调用具有顶级函数的第二个窗口。

根窗口有一个条目,第二个窗口只有一个标签,所以我想将(根窗口的)条目实时提供给标签(在第二个窗口中),所以我不想要点击一个按钮来给出文本。

我试过了:

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'

如何实时获取一等到二等的条目?

【问题讨论】:

    标签: python class tkinter tkinter-entry


    【解决方案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()
    

    【讨论】:

      【解决方案2】:

      textA StringVariableInterface 传递给Interface2.__init__(),然后使用textvariable 将其传递给Label()

      对关联的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()
      

      【讨论】:

      • 谢谢,现在文本条目现在传递给第二类。但是对于标签的实时更新,我可以使用线程吗?该线程只会调用 self.textA.get() 并将其传递给第二类?我去试试
      猜你喜欢
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多