
Всем доброго времени суток!
Только начал изучать Python (версия 3.7.1, Windows 10) — и есть некоторые вопросы. Заранее прошу прощения за, возможно, глупые для разбирающихся — но мне некоторые аспекты пока непонятны. У меня куча литературы скачана по программированию на Python, но пока катастрофически некогда читать. Да, там объясняется про графический интерфейс (оттуда и взял все знания) — но про мои трудности ничего не сказано. Или надо все прочесть сначала — тогда, может быть, некоторые вопросы отпадут. Но я даже не представляю, когда бы смог одну книгу закончить полностью — цейтнот по времени чудовищный…
Итак…
Первую программу я написал в виде шуточной викторины в текстовом формате. Все работало прекрасно.
Потом решил подняться на ступеньку выше и придать ей графический интерфейс. И вот тут возникли трудности:
- В текстовом варианте она была написана сверху-вниз линейно — т.е. начало вверху, конец внизу. Но при использовании кнопок и окон приходится (ну, я только такое нашел исполнение) использовать ‘command=…’ — и далее вводить имя ПРЕДВАРИТЕЛЬНО определяемого куска кода (через def). В итоге сейчас получается начало программы в самом конце — а все последующие этапы предварительно определяются выше. Вопрос в том, что последовательность кода не выполняется в пределах даже одного def-сегмента. В текстовом варианте программы действия просто выполнялись по порядку. А здесь (см. код ниже) у меня выполняется первый вопрос — а потом ничего не происходит. При этом при выборе любого варианта окно message_fagberge появляется, но при его закрытии программа ничего больше не делает. Даже если перебрать все варианты. Как заставить ее перейти ко второму вопросу?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# Вопросы по истории 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 — хотя она и стоит в конце (см. код выше. Сейчас просто закомментировано, т.к. не работает), ПОСЛЕ ожидания вариантов выбора, но выполняется почему-то сначала, отсчитывает указанные секунды — и только потом появляются пункты меню и тут же окно, что время на выбор кончилось. Почему так? В текстовом варианте все работало хорошо
Пока все. Не могу сдвинуться с этого места — поэтому других вопросов не возникает…
Заранее спасибо за помощь!
1 Ответы


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