【问题标题】:How to display GUI message indicating which checkbutton(s) and radiobutton have been selected in tkinter in Python?如何显示 GUI 消息,指示在 Python 的 tkinter 中选择了哪些复选按钮和单选按钮?
【发布时间】:2019-07-10 00:14:36
【问题描述】:

我对 Python 和一般编程非常陌生。我在tkinter 中搞砸了,试图制作一个愚蠢而简单的程序,这样我就可以更适应它了。

我对我的程序所做的是询问用户的姓名、年龄、他们是否记得某些事件以及他们是否觉得自己老了。就像我说的,它应该是一个轻松的程序,只是为了测试我的技能。

现在我想知道,如何显示 GUI 消息,指示在 Python 的 tkinter 中选择了哪些检查按钮和单选按钮?

这是代码和屏幕截图。我将包含我的结果的屏幕截图,但我可以让姓名和年龄正常工作,但无法使用复选框或单选按钮让消息正确显示在 GUI 中。

from tkinter import *

class MyFrame(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.master.geometry("600x400")
        self.master.title("How to tell if you're old")
        self.event = NONE
        self.old = NONE
        self.grid()

    #user name and age
        self.prompt = Label(self, text="What's your name?")
        self.prompt.grid(row=0, column=0, pady=5)

        self.input_name = Entry(self)
        self.input_name.grid(row=0, column=1, pady=5)

        self.prompt = Label(self, text="How old are you?")
        self.prompt.grid(row=2, column=0, pady=5)

        self.input_age = Entry(self)
        self.input_age.grid(row=2, column=1, pady=10)

    #user asks user if they remember certain events
        self.prompt = Label(self, text="Which of these events do"
                                   "you remember (may select more than one)?")
        self.prompt.grid(row=3, columnspan=5, pady=5)

        self.wheel_event = IntVar()
        self.check_wheel_event = Checkbutton(self, text="Invention of the wheel",
                                         variable=self.wheel_event, command=self.set_response_event)
        self.check_wheel_event.grid(row=4, column=0, padx=5)

        self.firstFlight_event = IntVar()
        self.check_firstFlight_event = Checkbutton(self, text="First flight",
                                               variable=self.firstFlight_event, command=self.set_response_event)
        self.check_firstFlight_event.grid(row=4, column=1, padx=5)

        self.Berlin_Wall_event = IntVar()
        self.check_Berlin_Wall_event = Checkbutton(self, text="Berlin Wall",
                                               variable=self.Berlin_Wall_event, command=self.set_response_event)
        self.check_Berlin_Wall_event.grid(row=4, column=2, padx=5)

        self.millennium_event = IntVar()
        self.check_millennium_event = Checkbutton(self, text="Millennium",
                                              variable=self.millennium_event, command=self.set_response_event)
        self.check_millennium_event.grid(row=4, column=3, padx=5)

    #user answers if they think they're old and if they want to know how
        # old they'll be in 10, 15, or 20 years
        self.prompt = Label(self, text="Do you consider yourself old?")
        self.prompt.grid(row=5, column=0, pady=5)

        self.feel_old = IntVar()
        self.feel_old.set(4)

        self.not_sure_old = Radiobutton(self, text="Not sure",
                                    variable=self.feel_old, value="0")
        self.not_sure_old.grid(row=6, column=0)

        self.no_old = Radiobutton(self, text="No",
                              variable=self.feel_old, value="1")
        self.no_old.grid(row=6, column=1)

        self.yes_old = Radiobutton(self, text="Yes",
                               variable=self.feel_old, value="2")
        self.yes_old.grid(row=6, column=2)

    #submit button
        self.button_submit = Button(self, text='Submit',
                                command=self.submit_click)
        self.button_submit.grid
        self.button_submit.grid(row=9, column=3, padx=10)

        self.my_name = StringVar()
        self.message = Label(self, textvariable=self.my_name)
        self.message.grid(columnspan=2, pady=10)

        self.my_age = StringVar()
        self.message = Label(self, textvariable=self.my_age)
        self.message.grid(columnspan=2, pady=10)

    #response
    def set_response_event(self):
        #remembering events
        if self.wheel_event.get() == 1:
            self.event = "wheel"
        elif self.firstFlight_event.get() == 1:
            self.event = "firstFlight"
        elif self.Berlin_Wall_event.get() == 1:
            self.event = "Berlin_Wall"
        elif self.millennium_event.get() == 1:
            self.event = "millennium"

    def set_response_old(self):
        #feeling old
        if self.not_sure_old.get() == "0":
            self.old = "not_sure_old"
        elif self.no_old.get() == "1":
            self.old = "no_old"
        elif self.yes_old.get() == "2":
            self.old = "yes_old"

    def submit_click(self):
        output_message = 'Well ' + self.input_name.get() + ', to begin with you are ' + self.input_age.get() + '.\n'
        output_message += 'You remember the ' + self.event +'.\n'
        output_message += 'This means you are ' + self.old + '.'

        self.my_name.set(output_message)

frame05 = MyFrame()
frame05.mainloop()

这是我得到的:

我意识到我可能很难做到这一点,但我觉得我真的很接近。感谢您的帮助!

【问题讨论】:

    标签: python checkbox tkinter radio-button message


    【解决方案1】:

    首先,我知道你永远不会打电话给set_response_old(self)。其次,您正在尝试将字符串与整数进行比较,这不会在您的 if 语句中被捕获。尝试像这样重写最后两个函数:

        def set_response_old(self):
            #feeling old
            if self.feel_old.get() == 0:
                self.old = "not sure old"
            elif self.feel_old.get() == 1:
                self.old = "no old"
            elif self.feel_old.get() == 2:
                self.old = "yes old"
    
        def submit_click(self):
            self.set_response_old()
            output_message = 'Well ' + self.input_name.get() + ', to begin with you are ' + self.input_age.get() + '.\n'
            output_message += 'You remember the ' + self.event + '.\n'
            output_message += 'This means you are ' + self.old + '.'
            self.my_name.set(output_message)
    

    当我运行它时,它会输出

    这意味着你已经老了。

    认为就是你想要的。

    @EDIT

    至于显示记住的事件列表...您可以将self.events_remembered = [] 添加到您的__init__ 部分以创建存储数据的位置(它不需要在init部分中,如下代码所示无论如何都会成功,但这是一个很好的做法!)然后更改您的 set_response 函数:

        def set_response_event(self):
        #remembering events
        self.events_remembered = [] # reset each time we are determining pressed events (so we don't just keep adding duplicates, and also remove any unchecked boxes)
        if self.wheel_event.get() == 1:
            self.events_remembered.append("wheel")
        if self.firstFlight_event.get() == 1:
            self.events_remembered.append("firstFlight")
        if self.Berlin_Wall_event.get() == 1:
            self.events_remembered.append("Berlin Wall")
        if self.millennium_event.get() == 1:
            self.events_remembered.append("millennium")
    

    您认为if 只会捕获第一个是正确的,但是没有规则禁止使用如图所示的一系列if 语句!

    最后你可以更新你的submit_click函数来搜索这些信息并显示格式化列表

    def submit_click(self):
        self.set_response_old()
        self.set_response_event() # use the function we just updated
        print(self.events_remembered)
        output_message = 'Well ' + self.input_name.get() + ', to begin with you are ' + self.input_age.get() + '.\n'
        output_message += 'You remember the ' + ", ".join(self.events_remembered) + '.\n'
        output_message += 'This means you are ' + self.old + '.'
        self.my_name.set(output_message)
    

    这里我们使用", ".join(iterable_list) 将我们的python 列表转换为一个漂亮的逗号分隔列表!

    如果这解决了您的问题,如果您可以通过单击帖子旁边的复选标记接受答案,我将不胜感激!如果你真的喜欢我,你也可以点赞我XD

    【讨论】:

    • 是的,这就是我要找的,非常感谢!
    • 我遇到的另一个问题是使复选框正常工作。如果我选择两个或更多复选框,它将点击第一个复选框并返回它。我知道这与我的 if 语句有关,但我不知道我做错了什么。我倾向于它需要成为一个循环。
    • @BryanH 我更新了我的帖子,展示如何修复复选框信息显示的格式!
    • 成功了,非常感谢!我将该答案标记为正确。我知道我有点接近,但只是看不到它。再次感谢您!
    【解决方案2】:

    要将所有复选框值输出到输出,请将 self.event 属性设为列表

    def __init__self():
        ...
        ...
        self.event=[]
    

    当您调用 set_response_event 函数时,将这些字符串值附加到该列表中。

    def set_response_event(self):
        #remembering events
        if self.wheel_event.get() == 1:
            self.event.append("wheel")
        elif self.firstFlight_event.get() == 1:
            self.event.append("firstFlight")
        elif self.Berlin_Wall_event.get() == 1:
            self.event.append("Berlin_Wall")
        elif self.millennium_event.get() == 1:
            self.event.append("millennium")
    

    最后使用 .join 函数打印列表

    'You remember the ' + ', '.join(self.event) + '\n'
    

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多