tkinter: не удается войти в виджет ввода

#python #tkinter #tkinter-entry

#python #tkinter #tkinter-запись

Вопрос:

Я не понимаю, почему поля ввода под rackGUI.py в моем коде являются статическими / не позволяют вводить что-либо. Я считаю, что все Entry объекты созданы правильно. Я указал textvariable как экземпляры StringVar() . Моя интуиция подсказывает мне, что проблема заключается в аргументе команды в create_button создании экземпляра, но я не совсем уверен, почему. Я думал, что при настройке command = lambda:function функция не будет вызвана.

При нажатии 'New' в меню, main.py успешно вызывает rackGUI.create() , который успешно вызывает input_form() . Нажатие кнопки 'create_button' успешно вызывает drawRack печать в оболочке '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
  

Комментарии:

1. Это работает для меня — Linux Mint 16, Python 2.7.5

2. Что вы имеете в виду: won't allow anything to be entered ? Вы не можете использовать клавиатуру или не можете задать текст при вводе с помощью set("text") ?

3. например, я пытаюсь щелкнуть по окну, но текстовый курсор не отображается, поэтому я ничего не могу ввести.

4. Если вы не сохраняете ссылку на свои StringVars, они совершенно не нужны и могут быть удалены. Однако я сомневаюсь, что это источник проблемы.

5. @user3761743: вы используете это на Mac? У Tkinter в OSX иногда возникают проблемы с фокусировкой.

Ответ №1:

Для всех, кто приходит сюда после меня, мое решение оказалось

 root.overrideredirect(True)
  

Отлично работает в Windows, но вызывает проблему с вводом текста на Mac.

Комментарии:

1. Та же проблема и в Ubuntu. Удалил эту строку, и проблема была решена.

Ответ №2:

Я действительно нашел проблему там. Проблема, похоже, находится в центре внимания Windows, поскольку вы используете messagebox.

В моем скрипте я просто поставил root.update() перед открытием другого окна (в моем случае filedialog), и все работало нормально. Для этого уже существует проблема:https://bugs.python.org/issue42867#msg384785