如何在执行命令前使tkinter按钮升高

2024-10-01 02:35:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试制作GUI应用程序,你必须选择predict按钮中的一个,然后输入的数字将被打印到终端,如果没有选择predict按钮,则应该打印select predict button to proceed。在

在pseudecode中类似于:

def check:
    now = new.get()
    if no lotto_button is selected:
        print("select predict button to proceed")
    else:
        print(now)

但面临挑战:

1:当我选择一个预测按钮时,两个按钮都会升高。在

2:在打印条目中的内容之前,如何使预测必须被选中。在

^{pr2}$

谢谢你,欢迎你的建议。在


Tags: to应用程序终端defcheckguibutton数字
3条回答

使用Radiobutton小部件对于这类多选处理往往更好。在

Radiobutton属于“组”,这意味着您可以设置它们,以便在默认情况下始终需要选择一个组。这意味着你不需要任何类型的错误捕捉或显示任何类型的指令给用户,它只是直观地工作。在

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,这是"Predict One"按钮的值。如果用户按下另一个Radiobutton,则值将变为2,这意味着第一个按钮“取消按下”,而{}的值将更改为2。在

当您单击其中一个按钮预测时,两个按钮都会被触发,因为在您的函数start_func中,您正在配置这两个按钮。 您可以绑定一个事件单击并在start_func中获取小部件,而不是配置这两个选项:

lotto_button = tk.Button(root, text="predict one")
lotto_button.bind('<1>', start_func)
lotto_button.pack(side="left")

然后在你的开始阶段:

^{pr2}$

关于你的第二点,我不太明白你的意思。在

至于强制选择,您可以在最外面的范围(与root = tk.Tk()处于同一级别)定义一个标志,以便您可以在函数中看到它是否设置为:

isPredicted = False

至于在选中一个按钮时禁用每个按钮,您可以定义您的start_func,使其以按钮对象(lotto_buttonlotto_button1)为参数:

^{pr2}$

要使用此函数,您需要按以下方式配置按钮,以便它们将自身作为参数传递:

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))

您的stop_func中也应该有isPredicted标志,以便它取消设置它:

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对于该按钮的命令而言始终为False:

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()

相关问题 更多 >