Найти - Пользователи
Полная версия: Как тормознуть прогу до принятия значения?
Начало » GUI » Как тормознуть прогу до принятия значения?
1 2
vito-Z80
tkinter
Основная программа проверяет первый вход в саму себя модулем from moduls import firstEnter В ней форма ввода на холсте.
1)Создаю холст, на нем поле ввода, и обрабатываю событие <Return>
2)По нажатию Интер уничтожаю холст и продолжаю работать в этом же окне.
3)Но все что находится дальше по коду после модуля from moduls import firstEnter - выполняется сразу же.
4)Пробовал зациклить выполнение while. While крутится пока не будет нажат Интер (в событие добавлено изменение значения (mainS.stop+=1)) и прога пошла дальше работать… но при таком раскладе Интер я нажать не могу, так как from moduls import firstEnter просто игнорируется и не исполняется вообще.
Как сделать так что бы основная программа ни чего не делала после from moduls import firstEnter, пока модуль не будет исполнен?
Понять не могу, если от меня ждут ввода данных в форму то какого лешего прога прет дальше. или форма(похоже не только форма) исполняется как прерывание в ассемблере ?

Вообщем есть какая то функция которая тормозит прогу но приняв значение продолжает ее выполнение ?


from moduls import mainSettings
from moduls import createDB
mainS=mainSettings
cDB=createDB.createDBcanvas
stop=mainS.stop     # stop=0
from moduls import firstEnter
'''
while mainS.stop == 0:
    if mainS.stop == 1:
        break
    continue
'''
print('go')
mainS.mainloop()

4) туплю, она не исполняется потому что не доходит до mainS.mainloop()

опять короче запутался как это все реализовать ? цикл делать в самом модуле ?
Может как то mainloop() можно притормаживать или использовать многократно?
mainloop(параметр) - что то типа такого - приняла параметр - пошла дальше работать до следующего mainloop(параметр)
vito-Z80
..или как сделать:
создал фрейм или прямоугольник на холсте, и пока не уничтожить фрейм, прямоугольник или холст, не давать программе работать дальше ?

Вообщем не хочу делать кучу окон в приложении, то есть вместо дополнительных окон просто создавать холсты с кнопками (как бы окно, но overrideredirect(1), что бы не было заголовка окна и кнопок fullScreen/свернуть/закрыть), так я могу закрывать содержимое главного окна верхним холстом/окном.
можно и overrideredirect(1), но не знаю как сделать такое окно всегда поверх главного окна, но не поверх всех окон(сторонних приложений) и почему то при попытке свернуть overrideredirect(1) собственной кнопкой что то не то происходит - хотя мне это не надо)
py.user.next
vito-Z80
Как сделать так что бы основная программа ни чего не делала после from moduls import firstEnter, пока модуль не будет исполнен?
Модуль не должен исполняться. В каждом модуле должна быть своя область с
if __name__ == '__main__':
    код

В идеале так должно быть
def main():
    код
 
if __name__ == '__main__':
    main()

Тогда ты можешь вызывать функцию модуля, где надо и когда надо, а простое импортирование ничего не будет запускать.
vito-Z80
py.user.next
у меня есть модуль с глобальными переменными, его тоже обязательно вгонять в функцию ?

Проверка if - это же для того что бы проверить модуль модуль при его непосредственном запуске, то есть вызывать при import мне его все равно надо так firstEnter.main() ?

Есть у меня модуль: firstEnter
    from moduls import mainSettings
    mainS=mainSettings
    if mainS.os.path.exists('title'):
        file=open('title/title.txt','r')
        title=file.readline()
        mainS.root.title(title)
    else:
        from moduls import createDB
        cDB=createDB.createDBcanvas(wCreateDb=900,hCreateDb=100)
        cDB.leftText(text='Введите название:')
        cDB.rightEntry()
        cDB.entryTitle.bind("<Return>",lambda event:cDB.saveTitle())
тут форма ввода, он исполняется и появляется на экране, когда код доходит до mainloop(), но перед mainlop есть еще код(то есть: from moduls import firstEnter, КОД, mainlop()), который не надо выполнять пока не будет получено значение поля ввода. Если логически подумать то это невозможно, если mainloop() нельзя вызывать несколько раз.
py.user.next
vito-Z80
у меня есть модуль с глобальными переменными, его тоже обязательно вгонять в функцию ?
Не, переменные и классы остаются.

vito-Z80
Проверка if - это же для того что бы проверить модуль модуль при его непосредственном запуске
Не, проверка __main__ делается для того, чтобы при непосредственном запуске запустился код, а при импортировании ничего не запускалось, только определения выполнились.

Ты импортируешь модуль (он сразу импортируется), а потом запускаешь из него только то, что надо. Так ты можешь его импортировать во многих программах одновременно. Допустим, тебе нужен только один класс из него, ты его импортируешь и берёшь этот класс, при этом ничего лишнего не выполняется.

vito-Z80
Может как то mainloop() можно притормаживать или использовать многократно?
У тебя сначала должно всё импортироваться, настроиться там всё, что надо, а потом в конце должен запуститься mainloop(). Если у тебя в каждом модуле будет свой mainloop(), то они все будут запускаться при импортировании. Чтобы этого не было, их нужно прятать за воротами с __main__.
vito-Z80
py.user.next
Чтобы этого не было, их нужно прятать за воротами с __main__.
не силен в сленге, хотя если и догадался то все равно не пойму как это сделать

if __name__ == ‘__main__’: не могу проверить модуль с #4 поста, так как он находится в папке, а вызывается из папки на уровень выше(там и создается папка title), или я не правильно понял = что должно быть модуль ?
Модуль обязан быть автономным ?


короче я так понимаю что бы мою идею реализовать нужно сразу создать кучу холстов disabled и по событиям активировать те которые нужны, так?
py.user.next
vito-Z80
Модуль обязан быть автономным ?
Каждый файл .py является модулем. Программа состоит из модулей. В каждом файле должны быть только объявления.

vito-Z80
короче я так понимаю что бы мою идею реализовать нужно сразу создать кучу холстов disabled и по событиям активировать те которые нужны, так?
Не, я так понял, ты вместо функций используешь модули.

Знаешь, что такое класс, функция, переменная? Что такое класс окна?

Вот пример кода
#!/usr/bin/env python3
 
import tkinter
 
class Window(tkinter.Frame):
    def __init__(self, master, title):
        tkinter.Frame.__init__(self, master)
        self.master = master
        self.master.title(title)
        self.master.geometry('200x100+400+400')
 
def main():
    top = tkinter.Tk()
    w = Window(top, 'My Window')
    top.mainloop()
 
if __name__ == '__main__':
    main()
doza_and
Может это поможет.

vito-Z80
есть какая то функция которая тормозит прогу
Любая функция тормозит прогу до тех пор пока не выполнится (собственно она и есть прога).
vito-Z80
Как сделать так что бы основная программа ни чего не делала после from moduls import firstEnter, пока модуль не будет исполнен?

Никак не сделать. Когда интерпретатор доходит до инструкции import он проверяет читал он уже этот модуль или нет. Если не читал, выполнит код из него, если читал то ничего не будет делать. Поэтому будет оно выполняться или нет зависит от порядка импорта во всех всех файлах проекта. Резюм импорт это не выполение кода. Надо чтото делать вызывайте функцию. т. е.

Не
import Check

а

from Check import Check_function
Check_function()
vito-Z80
py.user.next
Вот честно даже понять не могу ваш код.
def __init__ это конструктор - он выполняется когда обращаются к классу.
class Window(tkinter.Frame): так понял класс tkinter`а, только зачем это сделано ума не приложу.
tkinter.Frame.__init__(self, master) - вообще не понял.


читал Лутца - толку от этого нет, я его не понимаю когда в одном предложении из 10 слов встречается одно и то же слово 6 раз в разных склонениях, и само слово ни о чем не говорит. Да и не любитель я читать, то засыпаю то мысли в сторону. Вот если бы кто разжевал… ну или как всегда методом проб и ошибок придется все познавать, а хотелось бы быстрее.

doza_and
ну вызову я функцию, вызову за ней следующую + еще 5 штук, и все они выполнятся сразу, в моем случае отрисуются 7 холстов Canvas одни над другим, мне же их нужно вызывать в порядке работы с ними.

Вообщем забейте, извините что отвлек, просто ни я вас ни вы меня не понимаете.
py.user.next
vito-Z80
Вот честно даже понять не могу ваш код.
Просто элементарных знаний нет. Нельзя методом тыка изучать язык. Это можно только тогда, когда ты уже владеешь подобным языком.

vito-Z80
def __init__ это конструктор - он выполняется когда обращаются к классу.
Это инициализатор. Через него задаются начальные настройки экземпляра класса.

vito-Z80
class Window(tkinter.Frame): так понял класс tkinter`а, только зачем это сделано ума не приложу.
Класс Window - это самодельный класс. Его можно менять, как угодно. Но наследуется он от встроенного в tkinter класса, поэтому заранее обладает всеми свойствами наследуемого классса.

vito-Z80
tkinter.Frame.__init__(self, master) - вообще не понял.
Так как базовый класс также требует инициализации, в экземпляре нужно обратиться к унаследованной части и провести инициализацию.

vito-Z80
ну или как всегда методом проб и ошибок придется все познавать
Ну, вот ты познавал методом тыка, и допознавался до запуска модулей, тогда как модули используются в основном только для импортирования.

По идее, тебе надо сначала сформулировать задачу. Потому что в этом у тебя тоже каша. Я только и понял что-то про десять холстов.

Это самое главное:
1. Опиши словесно задачу.
2. Напиши реализацию, которая её решает.

Чтобы написать реализацию:
1. Составь словесное описание алгоритма.
2. Нарисуй блок-схему по словесному описанию.
3. Запиши псекдокод по блок-схеме.
4. Запиши реализацию по псевдокоду.

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

Если же ты сразу пишешь код, а все эти этапы пропускаешь, то у тебя получается лажа, которую потом переписываешь в другую лажу, которую потом переписываешь в другую лажу, и так десять раз. Время теряешь, а результат нулевой.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB