【问题标题】:tkinter: can't enter into entry widgettkinter:无法进入入口小部件
【发布时间】:2014-06-30 22:09:45
【问题描述】:

我不明白为什么我的代码中rackGUI.py 下的输入框是静态的/不允许输入任何内容。我相信所有Entry 对象都已正确实例化。我将文本变量指定为StringVar() 的实例。我的直觉告诉我问题在于create_button 实例化中的命令参数,但我不确定为什么。我认为通过设置command = lambda:function 不会调用该函数。

点击菜单中的'New'main.py成功调用rackGUI.create()rackGUI.create()成功调用input_form()。单击按钮'create_button' 成功调用drawRack,它会打印到shell 'test'。我还添加了一个测试,在该测试中我打印了每个输入框的值类型,即print type(rack_name.get()),这成功返回了'str' 类型。

所以主要问题还是输入框是静态的。

下面是我的代码:

config.py

"""
config.py
"""

import Tkinter as tk
import tkMessageBox as tkmb

#setup
root = tk.Tk()
root.title("TLA Database Tool")
frame = tk.Frame(height = 300, width = 250)
frame.pack()

main.py

#main.py
from config import *
import rackGUI

def createRackTemplate():
    rackGUI.create()
def loadRackTemplate():
    rackGUI.load()

menubar = tk.Menu(root)
filemenu = tk.Menu(menubar)
filemenu.add_command(label = "New", command = createRackTemplate)
filemenu.add_command(label = "Load", command = loadRackTemplate)
menubar.add_cascade(label = "File", menu = filemenu)

tkmb.showinfo("Welcome", "Under File click New to create a new rack template.\n\
Click load to load rack template.")
root.config(menu = menubar)
root.mainloop()

rackGUI.py

"""
rackGUI.py
"""
from config import *

def input_form():
    form_frame = tk.Frame(frame)
    form_frame.pack()

    tk.Label(form_frame, text = "Rack Template Name (e.g., Knox Type 4)").pack()
    rack_name = tk.Entry(form_frame, textvariable = tk.StringVar())
    rack_name.pack()
    tk.Label(form_frame, text = "Dimensions").pack()
    tk.Label(form_frame, text = "#rack rows").pack()
    num_rack_rows = tk.Entry(form_frame, textvariable = tk.StringVar())
    num_rack_rows.pack()
    tk.Label(form_frame, text = "#nodes per row").pack()
    num_slots = tk.Entry(form_frame, textvariable = tk.StringVar())
    num_slots.pack()

    create_button = tk.Button(form_frame, text = "Create!",\
              command = lambda: drawRack(rack_name, num_rack_rows, num_slots))
    create_button.pack()

def drawRack(rack_name, num_rack_rows, num_slots):
    print rack_name.get(), num_rack_rows.get(), num_slots.get()

def create():    
    input_form()

def load():
    pass

【问题讨论】:

  • 它适用于我 - Linux Mint 16,Python 2.7.5
  • 你是什么意思:won't allow anything to be entered?您不能使用键盘或者不能使用set("text") 在条目中设置文本?
  • 因为我尝试单击该框,但文本光标不会显示,因此我无法输入任何内容。
  • 如果您不保存对 StringVars 的引用,它们是完全没有必要的,可以删除。然而,我怀疑这是问题的根源。
  • @user3761743:你是在 Mac 上运行它吗? OSX 上的 Tkinter 有时会出现焦点问题。

标签: python tkinter tkinter-entry


【解决方案1】:

对于任何在我之后来到这里的人,我的解决方案最终是

root.overrideredirect(True)

在 Windows 上工作正常,但在 Mac 上导致此文本输入问题。

【讨论】:

  • 在 Ubuntu 上也有同样的问题。删除这一行,问题就解决了。
【解决方案2】:

我实际上在那里发现了问题。问题似乎是窗口的焦点,因为您使用的是消息框。

在我的脚本中,我刚刚在打开另一个窗口(在我的情况下是一个文件对话框)之前输入了一个root.update(),并且一切正常。有一个已经存在的问题:https://bugs.python.org/issue42867#msg384785

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多