首页 > 解决方案 > 使用 .get() 从另一个类中提取 Tkinter 变量

问题描述

我正在编写一个 Tkinter 应用程序,它要求用户显示的部分存在于两个不同的类中,两者都是从另一个文件导入的。我需要获取一段用户输入并将其从一个类传递到另一个类。在下面的玩具示例中,用户应该键入一些my_entry_input内容,以后该类PullVariable应该访问该内容。

代码如下。我有一些想法,例如以某种方式使用全局变量或在原始类中创建一个函数来获取变量然后将它们传回。在所有情况下,我得到:

AttributeError:类型对象“应用程序”没有属性“my_entry”

我能想到的最佳解决方案是创建一个响应绑定的函数,然后.get()将该函数传递给另一个类。我的感觉是 tkinter 不喜欢.get()课间。

感谢社区的帮助。

主要的

from import_test1 import *

root=Tk()
ui = Application(root)
ui.hello_world()
ui.entry()

pv = PullVariable()

if __name__ == '__main__':
    root.mainloop()

导入代码

from tkinter import *
from tkinter import ttk

class Application(Frame):        
    def __init__(self, parent, *args, **kwargs):
        print('Application init')
        Frame.__init__(self, parent, *args, **kwargs)
        self.parent=parent
        self.parent.grid()

    def entry(self):
        self.my_entry = StringVar(self.parent)
        my_entry_input = Entry(self.parent, textvariable=self.my_entry, 
            width=16)
        my_entry_input.bind('<FocusOut>', self.show_entry)
        my_entry_input.grid(column=0, row=1)
        self.show_label = Label(self.parent, text = '')
        self.show_label.grid(column=0, row=2)

    def hello_world(self):
        print('hello world')
        self.hw = Label(self.parent, text='Hello World!')
        self.hw.grid(column=0, row=0)

    def show_entry(self, event):
        PullVariable(Application).find_entry()

class PullVariable:
    def __init__(self, app):
        self.app = app
        print('Pull initiated')

    def find_entry(self, event=None):
        self.pulled_entry = self.app.my_entry.get()
        self.app.show_label['text'] = self.pulled_entry

标签: pythontkinter

解决方案


my_entry不是Application类的属性,所以不能做Application.my_entry,因为它是Application类实例的属性,所以可以做Application().my_entry。您可能可以添加 的实例Applicationmy_entry__init__方法PullVariable。我会用前者。

# ...
class PullVariable:
    def __init__(self, app): # add app here
        self.pulled_entry = app.my_entry.get() # use app here
        print(self.pulled_entry)
# and then
root=Tk()
ui = Application(root)
ui.hello_world()
ui.entry()

pv = PullVariable(ui) # supply PullVariable with instance of Application

推荐阅读