【问题标题】:How to use an Entry contents in a different class?如何在不同的类中使用条目内容?
【发布时间】:2019-06-28 19:03:45
【问题描述】:

我希望这不是重复的,看来我是少数喜欢将 Tkinter 用作 Tkinter 而不是 TK 的人之一...... 所以几乎我正在使用类来制作窗户。第二个窗口创建了一个用户,但我在不同的类中使用该值“用户名”时遇到了问题。 我错过了什么?

(免责声明,窗户很丑,我专注于使功能正常工作。) 我已经尝试将值 username 设置为 clicku() 函数的全局部分....如此处所示)...我已经将它移动了,尝试与当地合作...我迷路了。将条目设为自己的类会保存这个问题吗????

from tkinter import *


class Window(Frame):

    def __init__(self, master=None, *args, **kwargs):
        Frame.__init__(self,master,*args,**kwargs)
        self.pack()
        self.pack_propagate(0)
        self.labelone = Label(self, text = "Welcome to our class! Click start to begin")
        self.labelone.grid(row=1,column=1)
        self.buttonone = Button(self, text="start", command=click)
        self.buttonone.grid(row=2,column=1)


class Startwindow(Frame):

    def __init__(self, master=None, *args, **kwargs):
        Frame.__init__(self,master,*args,**kwargs)
        self.grid(row=5,column=5)
        self.grid_propagate(0)
        self.text = Label(self, text = "What is your name?")
        self.text.grid(row=0,column=0)
        self.entry = Entry(self, width=15)
        self.entry.grid(row=1,column=0)
        self.buttontwo = Button(self, text="enter", command=clicku)
        self.buttontwo.grid(row=1,column=1)
        self.username = self.entry.get()



class introwindow(Frame):

    def __init__(self, master=None,*args,**kwargs):
        Frame.__init__(self,master,*args,**kwargs)
        user = str(w2.username)
        self.grid()
        self.grid_propagate(0)
        self.a = Label(self, text = "Aki: ")
        self.a.grid(row = 0, column = 0)
        self.sp1 = Label(self, text = "Hi" + w2.username)
        self.sp1.grid(row = 0, column = 1)
        self.sp2 = Label(self, text = "Nice to meet you!")
        self.sp1.grid(row = 1, column = 1)
        self.talk = Entry(self, width = 15)


def click():
    global w2
    w.destroy()
    w2 = Startwindow(root,width=500,height=500)


def clicku():
    w2.destroy()
    w3 = introwindow(root,width=500,height=500)






root = Tk()
w = Window(root, bg="red",width=500,height=500)

root.mainloop()

我只是希望在introwindow 中打印用户名,作为Label sp1 的一部分。

【问题讨论】:

  • 为什么你认为它不起作用?它在做什么?它会抛出错误吗?如果是这样,错误是什么?如果不是,它在做什么?这与您的预期有何不同?

标签: python function class tkinter frames


【解决方案1】:

您可以通过创建 tkinter StringVar 的全局实例来实现。这是对您问题中发布的代码执行此操作(我也已更新以更密切地关注PEP 8 - Style Guide for Python Code)。

您当前的设计不允许充分利用它们(这就是我将其设为全局变量的原因)。但为了将来参考,这里有一些关于如何使用它们的additional information。

from tkinter import *


class Window(Frame):
    def __init__(self, master=None, *args, **kwargs):
        Frame.__init__(self, master, *args, **kwargs)
        self.pack()
        self.pack_propagate(0)
        self.labelone = Label(self, text="Welcome to our class! Click start to begin")
        self.labelone.grid(row=1, column=1)
        self.buttonone = Button(self, text="start", command=click)
        self.buttonone.grid(row=2,column=1)


class StartWindow(Frame):
    def __init__(self, master=None, *args, **kwargs):
        Frame.__init__(self, master, *args, **kwargs)
        self.grid(row=5,column=5)
        self.grid_propagate(0)
        self.text = Label(self, text="What is your name?")
        self.text.grid(row=0,column=0)
        self.entry = Entry(self, width=15, textvariable=username)
        self.entry.grid(row=1,column=0)
        self.buttontwo = Button(self, text="enter", command=clicku)
        self.buttontwo.grid(row=1,column=1)
        self.username = self.entry.get()


class IntroWindow(Frame):
    def __init__(self, master=None, *args, **kwargs):
        Frame.__init__(self,master, *args, **kwargs)
        self.grid()
        self.grid_propagate(0)
        self.a = Label(self, text="Aki: ")
        self.a.grid(row=0, column=0)
        self.sp1 = Label(self, text="Hi " + username.get())
        self.sp1.grid(row=0, column=1)
        self.sp2 = Label(self, text="Nice to meet you!")
        self.sp1.grid(row=1, column=1)
        self.talk = Entry(self, width=15)


def click():
    global w2
    w.destroy()
    w2 = StartWindow(root, width=500, height=500)


def clicku():
    w2.destroy()
    w3 = IntroWindow(root, width=500, height=500)


if __name__ == '__main__':

    root = Tk()
    username = StringVar()
    w = Window(root, bg="red", width=500, height=500)

    root.mainloop()

【讨论】:

  • 谢谢!我会调查一下。我简化了全局语句并将其直接放在“clicku”命令下,当我在窗口被销毁之前得到它时,这似乎有效(正如 Brian 在下一条评论中所说)。此外,if 语句中使用的下划线名称语法是否有名称?了解更多会很有帮助。
  • Bryan 建议显式检索值并将其作为参数传递给下一个窗口,这比将其设为全局变量更好。以双下划线开头和结尾的名称(有时称为“dunder”)是“特殊”变量,通常是系统定义的变量。 __name__ 是一个预定义的模块级别的,当脚本由 Python 解释器直接执行时设置为字符串 "__main__",而不是被其他脚本 imported — 换句话说,它被用作主程序,而不是其他脚本的模块。
  • PEP 8 - Style Guide for Python Code naming conventions 上有很好的信息和指南。
【解决方案2】:

由于您的入口小部件是introwindow 的属性,您只需在销毁窗口之前 调用入口小部件上的get 方法。然后可以将值传递给下一个窗口的构造函数

例如,它看起来像这样:

def clicku():
    name = w2.entry.get()
    print("clickU:", name)
    w2.destroy()
    w3 = IntroWindow(root, width=500, height=500, name=name)

当然,您需要修改 IntroWindow 类以接受该名称。

【讨论】:

  • 我让它使用全局工作,但我确实尝试了这种方法。我很难找出如何在原始 init 括号中标记参数...如果我想出那个方法,我会发布它!
猜你喜欢
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多