【问题标题】:Tkinter - Enable/Disable entry widget under certain conditionsTkinter - 在某些条件下启用/禁用条目小部件
【发布时间】:2020-12-07 11:30:46
【问题描述】:

在我的 Tkinter 应用程序中,我需要修改三个特殊的条目小部件 序列号、x、y,如下所示:

  1. 序列号 (sn) 条目中最多只能输入 4 位数字

  2. 条目 y 被禁用,如果 sn 为空,其值等于条目 x。

  3. 如果sn不为空,用户可以在y中输入随机输入

到目前为止,在 validate 命令选项的帮助下,我只能实现第一点。你们中有人知道如何在 validate 命令的帮助下实现 2) 和 3) 点吗?

from tkinter import *

root = Tk()

label_serial_number = Label(root, text = "Serial Number:")
label_x = Label(root, text = "Enter Value for x:")
label_y = Label(root, text = "Enter value for y:")

entry_serial_number = Entry(root)
entry_x = Entry(root)
entry_y = Entry(root)

# Display widgets
label_serial_number.grid(row = 0, column = 0, sticky = "W")
label_x.grid(row = 1, column = 0)
label_y.grid(row = 2, column = 0)

entry_serial_number.grid(row = 0, column = 1)
entry_x.grid(row = 1, column = 1)
entry_y.grid(row = 2, column = 1)


# 1) Part: - only digits can be entered in the series label - only 4 digits are allowed to enter
def only_numeric_input(P):
    if len(P) > 4:
        return False
    # checks if entry's value is an integer or empty and returns an appropriate boolean
    if P.isdigit() or P == "":  # if a digit was entered or nothing was entered
        return True
    return False

callback = root.register(only_numeric_input)  # registers a Tcl to Python callback
entry_serial_number.configure(validate="key", validatecommand=(callback, "%P"))  # enables validation

mainloop() 

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    对于第 2 项和第 3 项,首先为 x 和 y 条目创建一个 StringVar

    var_x = StringVar()
    entry_x = Entry(root, textvariable=var_x)
    entry_y = Entry(root, textvariable=var_x, state='disabled') # initial disabled
    

    然后你可以在 validate 函数中添加一些逻辑:

    def only_numeric_input(P):
        if len(P) > 0:
            # enable entry_y and unlink its content from entry_x
            entry_y.config(textvariable='', state='normal')
        else:
            # disable entry_y and link its content with entry_x
            entry_y.config(textvariable=var_x, state='disabled')
    
        if len(P) > 4:
            return False
        # checks if entry's value is an integer or empty and returns an appropriate boolean
        if P.isdigit() or P == "":  # if a digit was entered or nothing was entered
            return True
        return False
    

    【讨论】:

      猜你喜欢
      • 2016-04-13
      • 2018-09-15
      • 1970-01-01
      • 2015-08-24
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      相关资源
      最近更新 更多