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: