如何显示 GUI 消息,指示在 Python 中的 tkinter 中选择了哪些复选按钮和单选按钮?
How to display GUI message indicating which checkbutton(s) and radiobutton have been selected in tkinter in Python?
我是 Python 和一般编程的超级新手。我在 tkinter
中四处乱逛,试图制作一个愚蠢而简单的程序,以便我可以更适应它。
我正在用我的程序做的是询问用户的姓名、年龄、他们是否记得某些事件以及他们是否觉得自己老了。就像我说的,这应该是一个轻松的程序,只是为了测试我的技能。
现在我想知道,如何在 Python 中显示指示在 tkinter 中选择了哪些复选按钮和单选按钮的 GUI 消息?
这是代码和屏幕截图。我将包括我的结果的屏幕截图,但我可以让姓名和年龄正常工作,但无法使用复选框或单选按钮使消息正确显示在 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()
这是我得到的:
我意识到我可能正在以艰难的方式做这件事,但我觉得我真的很接近。感谢您的帮助!
首先,据我所知,您从未调用过 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)
当我 运行 它输出
This means you are yes old.
我认为是你想要的。
@EDIT
至于获取要显示的记忆事件列表...您可以将 self.events_remembered = []
添加到 __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 列表转换为一个漂亮的逗号分隔列表!
如果这解决了您的问题,请点击 post 旁边的复选标记接受答案,我将不胜感激!如果你真的喜欢我也可以点赞我哦XD
要将所有复选框值输出到输出中,请将 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'
我是 Python 和一般编程的超级新手。我在 tkinter
中四处乱逛,试图制作一个愚蠢而简单的程序,以便我可以更适应它。
我正在用我的程序做的是询问用户的姓名、年龄、他们是否记得某些事件以及他们是否觉得自己老了。就像我说的,这应该是一个轻松的程序,只是为了测试我的技能。
现在我想知道,如何在 Python 中显示指示在 tkinter 中选择了哪些复选按钮和单选按钮的 GUI 消息?
这是代码和屏幕截图。我将包括我的结果的屏幕截图,但我可以让姓名和年龄正常工作,但无法使用复选框或单选按钮使消息正确显示在 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()
这是我得到的:
我意识到我可能正在以艰难的方式做这件事,但我觉得我真的很接近。感谢您的帮助!
首先,据我所知,您从未调用过 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)
当我 运行 它输出
This means you are yes old.
我认为是你想要的。
@EDIT
至于获取要显示的记忆事件列表...您可以将 self.events_remembered = []
添加到 __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 列表转换为一个漂亮的逗号分隔列表!
如果这解决了您的问题,请点击 post 旁边的复选标记接受答案,我将不胜感激!如果你真的喜欢我也可以点赞我哦XD
要将所有复选框值输出到输出中,请将 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'