0
0 Комментариев

Всем доброго времени суток!

Только начал изучать Python (версия 3.7.1, Windows 10) — и есть некоторые вопросы. Заранее прошу прощения за, возможно, глупые для разбирающихся — но мне некоторые аспекты пока непонятны. У меня куча литературы скачана по программированию на Python, но пока катастрофически некогда читать. Да, там объясняется про графический интерфейс (оттуда и взял все знания) — но про мои трудности ничего не сказано. Или надо все прочесть сначала — тогда, может быть, некоторые вопросы отпадут. Но я даже не представляю, когда бы смог одну книгу закончить полностью — цейтнот по времени чудовищный…

Итак…

Первую программу я написал в виде шуточной викторины в текстовом формате. Все работало прекрасно.

Потом решил подняться на ступеньку выше и придать ей графический интерфейс. И вот тут возникли трудности:

  1. В текстовом варианте она была написана сверху-вниз линейно — т.е. начало вверху, конец внизу. Но при использовании кнопок и окон приходится (ну, я только такое нашел исполнение) использовать ‘command=…’  — и далее вводить имя ПРЕДВАРИТЕЛЬНО определяемого куска кода (через def). В итоге сейчас получается начало программы в самом конце — а все последующие этапы предварительно определяются выше. Вопрос в том, что последовательность кода не выполняется в пределах даже одного def-сегмента. В текстовом варианте программы действия просто выполнялись по порядку. А здесь (см. код ниже) у меня выполняется первый вопрос — а потом ничего не происходит. При этом при выборе любого варианта окно message_fagberge появляется, но при его закрытии программа ничего больше не делает. Даже если перебрать все варианты. Как заставить ее перейти ко второму вопросу?
# Вопросы по истории
def theme_history():
messagebox.showinfo("", 'Вы уверены, что вы ее знаете? Ох, сомневаюсь...')
# Вопрос 1
def message_fagberge():
messagebox.showinfo("", 'Что, не смогли ответить на такой простой вопрос? Что же будет дальше...')
themeBtn1.grid_forget()
themeBtn2.grid_forget()
themeBtn3.grid_forget()
themeBtn4.grid_forget()
historylabel1=Label(window, width = 30)
historylabel1.grid(row = 1, column = 2, padx=10)
historylabel1.configure(text='Так, что тут у нас? История? О, это интересно...')
historylabel2=Label(window, width = 30)
historylabel2.grid(row = 2, column = 2, padx=10)
historylabel2.configure(text='Вопрос первый: Кто был основателем ювелирного дома Фаберже? Варианты:') 
historyBtn1=Button(window)
historyBtn1.grid(row = 4, column = 2)
historyBtn1.configure(text='1. Баберже', command=message_fagberge)
historyBtn2=Button(window)
historyBtn2.grid(row = 5, column = 2)
historyBtn2.configure(text='2. Каберже', command=message_fagberge)
historyBtn3=Button(window)
historyBtn3.grid(row = 6, column = 2)
historyBtn3.configure(text='3. Лаберже', command=message_fagberge)
historyBtn4=Button(window)
historyBtn4.grid(row = 7, column = 2)
historyBtn4.configure(text='4. Цаберже', command=message_fagberge)
# i=10
# timer=Label(window, width=5)
# timer.grid(row = 5, column = 3, padx=10)
# while i>0:
# timer.configure(text=i); sleep(1)
# i-=1
# sleep(4)
window.mainloop()
 # Вопрос 2
def stydno():
messagebox.showinfo("Ошибка!", 'Да вы что? Стыдно такое не знать!...\nДаже страшно спрашивать дальше')
historyBtn1.grid_forget()
historyBtn2.grid_forget()
historyBtn3.grid_forget()
historyBtn4.grid_forget()
historylabel2.destroy()
historylabel3=Label(window, width = 30)
historylabel3.grid(row = 2, column = 2, padx=10)
historylabel3.configure(text='Вопрос второй: Что делал слон, когда пришел Наполеон?\nВарианты:') 
historyBtn5=Button(window)

2. Правильно ли я делаю сообщения об ошибках путем определения messagebox через def выше? Потому что по-другому (если вставить после command=) оно не работает. Но тогда при определении этого messagebox заранее у меня опять вопрос: а как после его выполнения логика программы пойдет дальше? Потому что точку исполнения перебросило выше — и дальше что? Или он (Python) просто вызывает ее в этом месте — и потом должен идти дальше из текущей точки программы? У меня это не работает (см. п. 1)

Или можно написать этот messagebox ниже, после всех вариантов — но как тогда заставить при нажатии кнопки обратиться к нему? Как вообще перемещаться по частям кода в пределах программы (знаю, что goto использовать крайне не рекомендуется)?

3. Не удаляются кнопки и текстовые части при смене пунктов меню (см. скриншот). То, что заменяется чем-то новым — вроде исчезает. А вот то, что нечем заменить — остается (см. рисунок). На него не действует ни destroy, ни forget. Даже не помогает затереть чем-нибудь с пробелами (хотя это костыли). Как это побороть?

4. В графическом интерфейсе не работает задержка sleep — хотя она и стоит в конце (см. код выше. Сейчас просто закомментировано, т.к. не работает), ПОСЛЕ ожидания вариантов выбора, но выполняется почему-то сначала, отсчитывает указанные секунды — и только потом появляются пункты меню и тут же окно, что время на выбор кончилось. Почему так? В текстовом варианте все работало хорошо

Пока все. Не могу сдвинуться с этого места — поэтому других вопросов не возникает…

Заранее спасибо за помощь!


Добавить комментарий