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

时间:2017-11-15 10:15:01

标签: python button tkinter

我试图制作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)

谢谢你,欢迎你提出建议。

3 个答案:

答案 0 :(得分:1)

至于强制选择,您可以在最外层范围内定义一个标记(与root = tk.Tk()处于同一级别),这样您就可以在函数中看到它是否设置:< / p>

isPredicted = False

至于在选择一个按钮时禁用每个按钮,您可以定义您的start_func,使得按钮对象(lotto_buttonlotto_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()