我试图制作GUI应用程序,必须在输入的数字之前选择predict
按钮之一才能打印到终端,如果没有选择predict
按钮,则应打印{ {1}}。
在pseudecode中就像:
select predict button to proceed
但有挑战:
1:当我选择一个预测按钮时,两个按钮都会被抬起。
2:如何在打印条目中的内容之前必须选择预测。
def check:
now = new.get()
if no lotto_button is selected:
print("select predict button to proceed")
else:
print(now)
谢谢你,欢迎你提出建议。
答案 0 :(得分:1)
至于强制选择,您可以在最外层范围内定义一个标记(与root = tk.Tk()
处于同一级别),这样您就可以在函数中看到它是否设置:< / p>
isPredicted = False
至于在选择一个按钮时禁用每个按钮,您可以定义您的start_func
,使得按钮对象(lotto_button
或lotto_button1
)作为参数:
def start_func(button_object):
global isPredicted
isPredicted = True
button_object.configure(relief=tk.SUNKEN, state=tk.DISABLED)
为了能够使用此功能,您需要按以下方式配置按钮,以便它们将自己作为参数传递:
lotto_button.configure(command=lambda button_object=lotto_button: start_func(button_object))
lotto_button1.configure(command=lambda button_object=lotto_button1: start_func(button_object))
您的isPredicted
也应该有stop_func
个标记,以便取消设置:
def stop_func():
global isPredicted
isPredicted = False
lotto_button.configure(relief=tk.RAISED, state=tk.ACTIVE)
lotto_button1.configure(relief=tk.RAISED, state=tk.ACTIVE)
至于您的terminal
功能,您希望根据isPredicted
的状态采取行动,因此需要将其定义为:
def terminal():
global isPredicted
if isPredicted:
now = new.get()
print(now)
else:
print("select predict button to proceed")
最后在你的"print number"
按钮中,你需要交换lambda中函数的顺序,或者isPredicted
对于该按钮的命令总是为假:
tk.Button(root, text="print number", command=lambda :[terminal(),
stop_func()]).place(x=150, y=300)
您的最终代码应如下所示:
import tkinter as tk
from tkinter import messagebox
def terminal():
global isPredicted
if isPredicted:
now = new.get()
print(now)
else:
print("select predict button to proceed")
def start_func(button_object):
global isPredicted
isPredicted = True
button_object.configure(relief=tk.SUNKEN, state=tk.DISABLED)
def stop_func():
global isPredicted
isPredicted = False
lotto_button.configure(relief=tk.RAISED, state=tk.ACTIVE)
lotto_button1.configure(relief=tk.RAISED, state=tk.ACTIVE)
root = tk.Tk()
root.geometry("400x400")
new = tk.StringVar()
en = tk.Entry(root, textvariable=new).pack()
isPredicted = False
lotto_button = tk.Button(root, text="predict one")
lotto_button.configure(command=lambda button_object=lotto_button: start_func(button_object))
lotto_button.pack(side="left")
lotto_button1 = tk.Button(root, text="predict two")
lotto_button1.configure(command=lambda button_object=lotto_button1: start_func(button_object))
lotto_button1.pack()
tk.Button(root, text="print number", command=lambda :[terminal(),
stop_func()]).place(x=150, y=300)
root.mainloop()
答案 1 :(得分:0)
当您点击其中一个按钮预测时,两者都会被提升,因为在您的函数start_func中,您需要同时配置它们。 您可以绑定事件单击并在start_func中获取小部件,而不是同时配置它们:
lotto_button = tk.Button(root, text="predict one")
lotto_button.bind('<1>', start_func)
lotto_button.pack(side="left")
然后在你的start_func:
def start_func(event):
w = event.widget
w.configure(relief=tk.SUNKEN, state=tk.DISABLED)
关于你的第二点,我不确定你的意思。
答案 2 :(得分:0)
使用Radiobutton
窗口小部件往往更适合这种多选处理。
Radiobutton
属于“groups”,这意味着您可以设置它们,以便默认情况下始终需要选择一个。这意味着您不需要任何类型的错误捕获或向用户显示任何类型的指令,它只是直观地工作。
from tkinter import *
root = Tk()
def command(v, entry):
print(v.get(), entry.get())
v = StringVar()
v.set(1)
entry = Entry(root)
rb1 = Radiobutton(root, text="Predict One", variable=v, value=1, indicatoron=0)
rb2 = Radiobutton(root, text="Predict Two", variable=v, value=2, indicatoron=0)
button = Button(root, text="Print Number", command=lambda:command(v, entry))
entry.pack()
rb1.pack()
rb2.pack()
button.pack()
root.mainloop()
因此,我们创建了一个StringVar()
,我们用它来定义哪些Radiobutton
小部件应该链接在一起,然后我们将其值设置为1
,这是{{1}的值}按钮。如果用户按下另一个"Predict One"
,则值会更改为Radiobutton
,这意味着第一个按钮“取消”,而2
的值将更改为StringVar()
。