2015-07-24 4 views
1

Я уже давно использую Python, и я сделал несколько приложений с графическим интерфейсом. Когда я писал свое новое приложение, я наткнулся на какое-то поведение tkinter, которое, я думаю, просто странно.Python tkinter: кнопка исчезает после обновления метки

Рассмотрим следующий код:

from tkinter import * 

root = Tk() 
root.geometry('200x200') 

label = Label(root, bg='green', text='0', font=('arial', 40, 'bold')) 
label.place(x=0, y=0, width=200, height=200) 

def add(): 
    label['text'] = int(label['text']) + 1 
    if label['text'] == 10: 
     button.place_forget() 

button = Button(root, command=add, text='+1', font=('arial', 20, 'bold')) 
button.place(x=50, y=50, width=100, height=100) 

root.mainloop() 

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

Проблема, с которой я столкнулся, возникает, когда я использую другой родительский виджет для виджета кнопки. Например, когда я изменить эту строку

button = Button(root, command=add, text='+1', font=('arial', 20, 'bold')) 

в

button = Button(label, command=add, text='+1', font=('arial', 20, 'bold')) 

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

После некоторого тестирования я обнаружил, что кнопка исчезает при каждом обновлении родительской метки.

Мне было интересно; Почему это происходит? И есть ли способ исправить проблему, не используя «root» в качестве родителя для кнопки (это сделало бы мое приложение намного сложнее или, по крайней мере, заставило бы меня перестроить много вещей gui)

I пытался найти информацию об этой проблеме, но я не мог найти ее.

+2

Обычно родительский вид виджетов является либо (потомками) 'Toplevels', либо' Frames'. Мой вопрос: почему логически вы хотите сделать ярлык родителем кнопки? – nbro

+0

На какой платформе вы работаете? –

+0

Я использую Windows 8.1 64 бит. – kolokkol

ответ

2

Я не думаю, что есть веская причина, почему вы видите это поведение. Я не вижу его в OSX, но кнопки OSX ведут себя немного иначе, чем другие платформы. Должно быть прекрасно использовать ярлык в качестве родителя для другого окна, не видя этого мерцания.

Одним из возможных способов обхода может быть вызов lift на виджет кнопки всякий раз, когда вы перенастраиваете ярлык. Возможно, порядок укладки меняется на вас, вызывая надпись над кнопкой.

Наконец, знаете ли вы, что вы можете использовать место с относительными координатами, и что виджеты могут относиться к другим виджетам, даже если нет родительских/дочерних отношений? Вам кажется, что вам придется изменить много кода, если вы не можете создать два виджета в родительском/дочернем отношениях.

Например, вы можете создать свой виджет и вызвать place так:

button = Button(root, command=add, text='+1', font=('arial', 20, 'bold')) 
button.place(in_=label, relx=0, rely=0, relwidth=1, relheight=100) 

Вы должны убедиться, что порядок укладки является правильным. Самый простой способ - просто убедиться, что кнопка создается после создания метки.

+0

Это действительно помогло, спасибо! – kolokkol