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

3 ответа

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

root.overrideredirect(True)

Хорошо работает на Windows, но вызывает эту проблему ввода текста на Mac.

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

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

tkinter: не могу войти в виджет входа

Для Python 2.7 и Python 3.x вы можете комментировать или закомментировать.

У вас было слишком много оконного мусора. Другими словами, чтобы предотвратить мусор из окон. Вот почему ты не звонишьimport tkinter

Мы сосредоточимся на Python 3.x, так как у меня нет Python 2.7.

  • Двигатьсяimport rackGUя внутриcreateRackTemplate()функция. Это предотвратит мусорное окно.

Для main.py:

      import tkinter as tk

root = tk.Tk()
root.withdraw()

from config import * #Python 3.x
#import tkMessageBox as tkmb Python 2.7
 

def createRackTemplate():
    import rackGUI
    rackGUI.create()
    
def loadRackTemplate():
    test_3.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)

#Python 3.x
messagebox.showinfo("Welcome", "Under File click New to create a new rack template.\n\
Click load to load rack template.")


#Comment in for Python 2.7
#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()

Для config.py:

      """
config.py
"""

import tkinter as tk #Python 3.x
#import Tkinter as tk #Python 2.7

from tkinter import messagebox #Python 3.x
#import tkMessageBox as tkmb #Python 2.7

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

ДляrackGUI.py:

  • Добавить модульimport tkinter as tkи добавьте фрейм = tk.Tk(). Потому что вы вызываете кадр для каждогоtkinterвиджеты

Код:

      from config import *
import tkinter as tk


frame = tk.Tk()
...
...

Скриншот для Python 3.x:

Другие вопросы по тегам