【问题标题】:tkinter Entry to StringVar() binding do not worktkinter 到 StringVar() 绑定的条目不起作用
【发布时间】:2021-03-19 17:44:36
【问题描述】:

我有一个问题,我不知道为什么.. 此屏幕截图总结了所有需要的代码: Screenshot_Code

请不要找意义,我尽可能地修剪了代码,只是为了显示问题。

我的问题如下:

  • 如果我运行 main.py
  • 然后根据“ui_root.py”点击Button
  • 然后在Entry-Field中输入一些文字,根据“create_user.py”点击Button
  • 那么我的 print Statement 是空的,分别是 StringVar() 绑定不起作用

如果我直接运行“create_user.py”(取消注释 UiCreateUser()),那么我的 print-Statement 会准确打印我的 Entry-Widget 中的内容/文本。

为什么?我不明白,如果有人可以帮助我,我会很高兴..提前谢谢。

复制粘贴的代码(阅读用截图,可能比这个更好):

ma​​in.py

from ui_root import UiRoot
app = UiRoot()
app.mainloop()

ui_root.py

from tkinter import Tk, Button
from pixela_brain import PixelaBrain

class UiRoot(Tk):

    def __init__(self):
        super().__init__()
        self.brain = PixelaBrain()

        self.button = Button(self, text="Button", command=self.click)
        self.button.pack()

    def click(self):
        self.brain.create_user()

pixela_brain.py

from popup_windows import create_user
import json


class PixelaBrain:
    def __init__(self):
        pass

    def create_user(self):
        self.new_user = create_user.UiCreateUser()

create_user.py

from tkinter import Tk, Entry, Button, StringVar


class UiCreateUser(Tk):
    def __init__(self):
        super().__init__()

        # Entry
        self.entry_var = StringVar()
        self.entry = Entry(self, textvariable=self.entry_var)
        self.entry.pack()

        # Button
        self.button = Button(self, text="Click", command=self.btn_click)
        self.button.pack()

        self.mainloop()

    def btn_click(self):
        print(self.entry_var.get())


# UiCreateUser()

【问题讨论】:

  • 您正在创建多个Tk 的(子类)实例。每一个都是一个完全独立的环境,有自己的变量、图像等,其他任何实例都无法访问。您需要使用Toplevel() 来创建额外的窗口。
  • 但是我在 UiCreateUser 类中创建了 StringVar() 并且我在同一个类(对象、实例......)中访问它。所以我不尝试从另一个实例访问 StringVar() 。我很困惑:)
  • 您没有在任何特定的Tk 实例中显式创建StringVar,因此会为您选择一个(我认为这是程序中创建的第一个)。包含代码的类与它完全无关。
  • 尝试将self.entry_var = StringVar()更改为self.entry_var = StringVar(master=self)

标签: python python-3.x tkinter tkinter-entry


【解决方案1】:

这是一个“答案”,因为来自 jasonharper(在上面的 cmets 中)的输入解决了我的问题,我想结束这个问题。

只需将 class UiCreateUser(Tk) 替换为 class UiCreateUser(Toplevel) 即可解决问题。

非常感谢:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多