【问题标题】:How to change button state upon press tkinter如何在按下 tkinter 时更改按钮状态
【发布时间】:2021-03-20 06:00:01
【问题描述】:

我正在编写一个计算器,它可以做很多事情,我想问一下如何在按下它时更改按钮状态。我正在使用以下代码:

import math, sqlite3
from tkinter import *


root = Tk()
x_are = Label(root)
x_are.grid(row=0, column=0)
x_are_ = Label(root)
x_are_.grid(row=0, column=0)
boo = True
bool_ = True


formula_entry = ''
def geometric_calc_press():
    global bool_
    def formula():
        global bool_, state, formula_entry
        if bool_:
            formula_entry = Entry(geometric_calc, width=66)
            formula_entry.grid(row=1, column=0, columnspan=1000)
            bool_ = False
        def show_searched_formula():
            global formula_entry
            x = formula_entry.get()
            print(x)
        def close():
            global bool_, state, formula_entry, close, search_
            bool_ = True
            formula_entry.destroy()
            close_.destroy()
            search.destroy()
        if not bool_:
            close_ = Button(geometric_calc, text='Close', command=close, bg='black', fg='lime', highlightcolor="lime", highlightbackground="lime",
                           highlightthickness=2, relief=SOLID, default='active', padx=80, pady=20)
            close_.grid(row=3, column=0)

            search = Button(geometric_calc, text='Search', command=show_searched_formula, bg='black', fg='lime', highlightcolor="lime", highlightbackground="lime",
                           highlightthickness=2, relief=SOLID, default='active', padx=77, pady=20)
            search.grid(row=2, column=0)




    global root
    root.destroy()
    geometric_calc = Tk()
    bindings = {
        '<FocusIn>': {'default': 'active'},
        '<FocusOut>': {'default': 'active'}
    }
    for k, v in bindings.items():
        geometric_calc.bind_class('Button', k, lambda e, kwarg=v: e.widget.config(**kwarg))

    geometric_calc.geometry('400x415')
    geometric_calc.config(bg='black')
    formula_finder = Button(geometric_calc, text='Formulas', bg='black', fg='lime', highlightcolor="lime",
                            highlightbackground="lime", highlightthickness=2, relief=SOLID, default='active', padx=70,
                            command=formula)
    formula_finder.grid(row=0, column=0)

    formula_user = Button(geometric_calc, text='Calculate', bg='black', fg='lime', highlightcolor="lime",
                            highlightbackground="lime", highlightthickness=2, relief=SOLID, default='active', padx=70)
    formula_user.grid(row=0, column=2)

唯一相关的部分是geometric_calc_press 函数。我希望能够修复一个错误,如果多次按下公式按钮(关闭按钮然后需要按下相同的次数),关闭按钮不起作用。所以我想在按下时禁用公式按钮直到关闭按钮被按下。我真的不知道该怎么做,所以我在这里问。

【问题讨论】:

  • 顺便说一句,我知道代码有点乱,但上周我真的不知道我的上课方式,就这样开始了。还不想改...
  • 对于一个简单的问题,这有很多代码。请尝试将您的代码缩减为Minimal, Complete, and Verifiable example
  • 对不起,我编辑了,现在缩小了。
  • 问题可能是因为您多次创建关闭按钮 - 您应该在开始时只创建一次而不显示它(没有grid())并且只显示它(使用grid())按下@ 987654325@ - 以后你应该用grid_forget() 隐藏它而不使用destroy()
  • 另一种方法是使用一些变量(pressed_formula = True)来控制是否按下formula,下次跳过创建close button的代码。当你销毁close button 然后重置这个变量(pressed_formula = False

标签: python tkinter button widget


【解决方案1】:

你可以用

关闭按钮
button.config(state="disabled")

然后用

激活它
button.config(state="normal")

button.config(state="active")

顺便说一句:您也可以以同样的方式停用其他小部件 - 即。 LabelEntry 等。其他小部件可能有不同的状态 - 即。 Entry 有状态"read-only"(但它没有"active"


最小的工作示例

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---

def on_press_1():
    b1.config(state="disabled")
    l1.config(state="disabled")
    e1.config(state="disabled")  # or `readonly`

def on_press_2():
    b1.config(state="normal")  # or `active`
    l1.config(state="normal")  # or `active`
    e1.config(state="normal")

# --- main ---

root = tk.Tk()

l1 = tk.Label(root, text="Label Text")
l1.pack()

e1 = tk.Entry(root)
e1.insert(0, "Entry Text")
e1.pack()

b1 = tk.Button(root, text="Deactivate", command=on_press_1)
b1.pack()

b2 = tk.Button(root, text="Activate", command=on_press_2)
b2.pack()

root.mainloop()

【讨论】:

    猜你喜欢
    • 2018-07-27
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多