StringVar

时间:2015-06-07 01:30:40

标签: python user-interface python-3.x tkinter

我要创建一个类似于下图的程序。界面使用一个文本条目作为名称,一个按钮和两个标签。该按钮应该有文本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行中。

3 个答案:

答案 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值,以便更新标签/名称值。