【问题标题】:Dynamically enable and disable textbox Python Tkinter动态启用和禁用文本框 Python Tkinter
【发布时间】:2021-07-26 22:40:35
【问题描述】:

我正在尝试实现以下行为: 互斥文本框(条目标签),遵循如下规则

  • 3 个框中只有两个可以同时输入文本(必须删除内容才能重新启用第三个)
  • 填写一个框会禁用一组主题。
  • (不需要,很高兴拥有)将鼠标悬停在禁用的文本框上时出现的工具提示,说明它被锁定的原因。

我的想法是在“条目”标签的“命令”属性上设置一个“检查”功能,以便在编辑每个文本框时,代码会检查所有指定的“原因”文本框的值,如果满足某些条件,禁用一组“效果”文本框。

我相信我也得转发声明所有的Entry标签,然后声明功能,然后配置Entry标签具有这个功能,然后将它们打包到屏幕上。

有没有更好的方法来做到这一点?或者至少是一种避免前向声明要求的方式?

谢谢,欢迎随时索取更多信息!

编辑: 这是一个示例实现

entry1 = tk.Entry (window) 

entry2 = tk.Entry (window) 

def shut_x():
    if entry1.get() != "":
        entry2.configure(state="disabled")
    else:
        entry2.configure(state="normal")

entry1.configure(command=shut_x())

canvas1.create_window(650, 140, window=entry1)
canvas1.create_window(650, 340, window=entry2)

【问题讨论】:

  • 不清楚你在问什么。你真的只是问是否有更好的方法吗?如果是这样,如果您展示了一个实际的实现,而不仅仅是对实现的描述,那将会有所帮助。另外,“'Entry'标签的'command'属性”是什么意思?条目小部件和标签小部件都没有“命令”属性。
  • 我添加了一段代码示例。澄清一下,是的,我问是否有更好的方法,因为这对我来说真的很笨重。此外,“tutorialspoint.com/python/tk_entry.htm”的文档说该条目确实具有命令属性。也许我们正在考虑不同的事情?
  • @Frogglet 将StringVar 添加到条目并跟踪该变量。
  • @Frogglet:文档有误。
  • @BryanOakley 好吧,我之前使用过它并且它正在工作,但不是最佳的,因为它也在标签的创建中运行该功能。无论如何,我使用了 TheLizzard 的解决方案,所以我现在一切都很好:D

标签: python user-interface tkinter dynamic textbox


【解决方案1】:

试试这样的:

import tkinter as tk

def shut_x(*args):
    if entry1.get() != "":
        entry2.config(state="disabled")
    else:
        entry2.config(state="normal")

root = tk.Tk()

tk_variable = tk.StringVar(root)
tk_variable.trace("w", shut_x)

entry1 = tk.Entry(root, textvariable=tk_variable)
entry1.pack()

entry2 = tk.Entry(root)
entry2.pack()

root.mainloop()

这将创建一个StringVar 变量并将其附加到entry1。它还使用回调函数shut_x 跟踪该变量。

对于您请求的 3 个条目(用户只能写入其中的 2 个):

import tkinter as tk

def shut_x(*args):
    number_of_entries_with_text = 0
    number_of_entries_with_text += entry1.get() != ""
    number_of_entries_with_text += entry2.get() != ""
    number_of_entries_with_text += entry3.get() != ""
    # Check if some how you managed to insert text in all 3 of the entries:
    # It should never happen
    assert number_of_entries_with_text <= 2, "An internal error"
    if number_of_entries_with_text == 2:
        if entry1.get() == "":
            entry1.config(state="disabled")
        elif entry2.get() == "":
            entry2.config(state="disabled")
        elif entry3.get() == "":
            entry3.config(state="disabled")
    elif number_of_entries_with_text < 2:
        if entry1.get() == "":
            entry1.config(state="normal")
        if entry2.get() == "":
            entry2.config(state="normal")
        if entry3.get() == "":
            entry3.config(state="normal")

root = tk.Tk()

tk_variable_entry1 = tk.StringVar(root)
tk_variable_entry1.trace("w", shut_x)

tk_variable_entry2 = tk.StringVar(root)
tk_variable_entry2.trace("w", shut_x)

tk_variable_entry3 = tk.StringVar(root)
tk_variable_entry3.trace("w", shut_x)

entry1 = tk.Entry(root, textvariable=tk_variable_entry1)
entry1.pack()

entry2 = tk.Entry(root, textvariable=tk_variable_entry2)
entry2.pack()

entry3 = tk.Entry(root, textvariable=tk_variable_entry3)
entry3.pack()

root.mainloop()

【讨论】:

  • 非常感谢。这对我有用!现在花几个小时硬编码我的所有条件:P
  • @Frogglet 应该需要 10 多分钟。我也会这样做(并更新我的答案)
  • @Frogglet 完成我实现了 3 个条目。对于工具提示窗口的事情,你必须谷歌,因为我不是这方面的专家。
  • 非常感谢!我的版本更笨重:)
  • @Frogglet 没问题。好吧,我的也不是最好的。我本可以使用一个列表并对其进行迭代。但如果它有效,它就会有效。
猜你喜欢
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多