我要创建一个类似于下图的程序。界面使用一个文本条目作为名称,一个按钮和两个标签。该按钮应该有文本Say hello,当用户点击按钮时,底部标签应该在其前面显示Hi的名称(见下图)
这就是我所拥有的
from tkinter import *
from tkinter.ttk import *
def say_hello():
name_var.set(name_entry.get())
def main():
global window, name_var, name_entry
window = Tk()
top_label = Label(window, text='Enter a name below')
top_label.grid(row=0, column=0)
name_var = StringVar()
name_entry = Entry(window, textvariable=name_var)
name_entry.grid(row=1, column=0)
hello_button = Button(window, text='Say hello', command=say_hello)
hello_button.grid(row=2, column=0)
bottom_label = Label(window, text='Hi ' + name_var)
bottom_label.grid(row=3, column=0)
window.mainloop()
main()
当我尝试运行它时,我收到此错误:
Traceback (most recent call last): File "C:\Program Files (x86)\Wing IDE 101 5.1\src\debug\tserver_sandbox.py", line 29, in <module> File "C:\Program Files (x86)\Wing IDE 101 5.1\src\debug\tserver_sandbox.py", line 24, in main builtins.TypeError: Can't convert 'StringVar' object to str implicitly
一切都是GUI明智的,我只是不确定如何在按下按钮后得到“Hi Jack”的最后一个标签 - 即我的命令应该在hello_button行中。
答案 0 :(得分:2)
这是你的冒犯性代码:
bottom_label = Label(window, text='Hi ' + name_var)
您无法真正添加字符串和类的实例。 Tkinter StringVar
实际上并不是一个字符串,而是像gui一样拿着字符串的特殊事物。这就是为什么它可以自动更新和类似的东西。解决方案很简单:
bottom_label = Label(window, text = 'Hi ' + name_var.get())
答案 1 :(得分:0)
以下是我的表现:
#!/usr/bin/env python2.7
import Tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
self.name_var = tk.StringVar()
tk.Frame.__init__(self, master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.top_label = tk.Label(self, text='Enter a name below')
self.top_label.grid(row=0, column=0)
self.name_entry = tk.Entry(self)
self.name_entry.grid(row=1, column=0)
self.hello_button = tk.Button(self, text='Say hello', command=self.say_hello)
self.hello_button.grid(row=2, column=0)
self.output = tk.Label(self, textvariable=self.name_var)
self.output.grid(row=3, column=0)
def say_hello(self):
self.name_var.set("Hi {}".format(self.name_entry.get()))
root = tk.Tk()
app = Application(master=root)
app.mainloop()
最终它与您的代码非常相似。您唯一缺少的是如何正确使用Tkinter.StringVar()
。您需要在创建时将底部标签textvariable
设置为name_var
,然后您应该好好去。
答案 2 :(得分:0)
这个简单的课应该做你想做的事:
from tkinter import Button, Tk, Entry,StringVar,Label
class App():
def __init__(self, **kw):
self.root = Tk()
# hold value for our output Label
self.s = StringVar()
# label above our Entry widget
self.l = Label(self.root, text="Enter name here").pack()
# will take user input
self.e = Entry(self.root)
self.e.pack()
self.b = Button(self.root, text="Say Hello",command=self.on_click).pack()
# textvariable points to our StringVar
self.l2 = Label(self.root, textvariable=self.s).pack()
self.root.mainloop()
# every time the Button is pressed we get here
# an update the StringVar with the text entered in the Entry box
def on_click(self):
self.s.set(self.e.get())
App()
您只需要创建几个标签,并使用Entry小部件来获取名称,使用回调函数来更新StringVar值,以便更新标签/名称值。