2015-06-02 2 views
2

Я пишу годовую программу проверки данных и нуждаюсь в некотором входе пользователя с ней и решил пойти по маршруту tkinter. Я создал интерфейс для одного из экрана ввода пользователя и должен будет создавать другие, но у меня возникают некоторые проблемы с уничтожением окон после выбора и глобализация переменной.Использование tkinter для назначения глобальной переменной и уничтожения gui

В идеале программа запускается, открывается окно, выбирается соответствующий выбор атрибута, текст на этой кнопке передается функции «назначить», которая создает глобальную переменную, которая будет использоваться в моей программе, и окно исчезает.

Как сейчас, при запуске этого кода возникает ошибка: «TclError: не может вызвать кнопку« команда: приложение было уничтожено ».

Если я прокомментирую строку «mGui.destroy()», я могу выбрать кнопку и закрыть окно вручную, но переменная «DRN» передается переменной «x» независимо от того, что!

import sys 
from Tkinter import * 

def assign(value): 
    global x 
    x = value 
    mGui.destroy() 

mGui = Tk() 
mGui.geometry("500x100+500+300") 
mGui.title("Attribute Selection Window") 

mLabel = Label(mGui, text = "Please select one of the following attributes to assign to the selected Convwks feature:").pack() 

mButton = Button(mGui, text = "CON", command = assign("CON")).pack() 
mButton = Button(mGui, text = "MS", command = assign("MS")).pack() 
mButton = Button(mGui, text = "DRN", command = assign("DRN")).pack() 

mGui.mainloop()  #FOR WINDOWS ONLY 

Bonus проблема: Собираем все кнопки на одной строке с пробелами между ними, сохраняя при этом их по центру.

+0

Это может быть дубликат http://stackoverflow.com/questions/5767228/tkin ter-button-not-working/5771787 # 5771787 –

ответ

2

Проблема с вашим кодом заключается в том, что вы не можете вызывать функции при добавлении команд кнопок. Вы не можете написать Button(command=function()), вам нужно написать Button(command=function). Если вы хотите, чтобы передать аргумент в функцию, вы должны будете сделать это следующим образом:

вместо:

mButton = Button(mGui, text = "CON", command = assign("CON")).pack() 
mButton = Button(mGui, text = "MS", command = assign("MS")).pack() 
mButton = Button(mGui, text = "DRN", command = assign("DRN")).pack() 

Вы должны написать:

mButton = Button(mGui, text = "CON", command = lambda: assign("CON")).pack() 
mButton = Button(mGui, text = "MS", command = lambda: assign("MS")).pack() 
mButton = Button(mGui, text = "DRN", command = lambda: assign("DRN")).pack() 

Если вы хотите чтобы поместить все кнопки в один и тот же ряд, вы можете использовать этот код:

import sys 
from Tkinter import * 

def assign(value): 
    global x 
    x = value 
    mGui.destroy() 

mGui = Tk() 
mGui.geometry("500x100+500+300") 
mGui.title("Attribute Selection Window") 

frame1 = Frame(mGui) 
frame1.pack() 

mLabel = Label(frame1, text = "Please select one of the following attributes to assign to the selected Convwks feature:").grid(row=0, column=0) 

frame2 = Frame(mGui) 
frame2.pack() 


mButton = Button(frame2, text = "CON", command = lambda: assign("CON")).grid(row=0, column=0, padx=10) 
mButton = Button(frame2, text = "MS", command = lambda: assign("MS")).grid(row=0, column=1, padx=10) 
mButton = Button(frame2, text = "DRN", command = lambda: assign("DRN")).grid(row=0, column=2, padx=10) 
mGui.mainloop()  #FOR WINDOWS ONLY 
+2

Использование 'place' - плохой совет, на мой взгляд. Как 'pack', так и' grid' можно использовать для ввода кнопок в ряд, и их гораздо проще использовать и поддерживать с течением времени. –

+0

Это прекрасно работает, спасибо за ваш ответ. Мои цели требуют gui, который позволяет использовать 3-9 кнопок/параметров, поэтому я только что создал функции для каждого из них и назову их по всему скрипту! –

Смежные вопросы