Найти - Пользователи
Полная версия: Tkinter и import в __init__.py
Начало » GUI » Tkinter и import в __init__.py
1 2
Strelok-den
Есть код(приводить нет смысла) с использованием Tkinter который прекрасно работает на виндовс и мак, но при таком импортирование из __init__.py:
import init
При любом вызове label.configure(text='1111') в потоке получаю: RuntimeError: main thread is not in main loop

Из-за чего происходит и как лечить? В принципе понятно что дело в потоке, так как Tkinter с ним не работает, но почему при вызове напрямую init.py работает, а через __init__.py нет?

Нашел вот такую вещь http://tkinter.unpythonic.net/wiki/mtTkinter
Стоит ли с ней возиться? или забить на все Tkinter, ttk, и все же перейти как и думал месяц назад на PyQt4..

Спасибо)
4kpt_III
__init__.py это зарегистрированное имя. Я называю несущий файл в этом случае system.py или main.py.
__init__.py имеет смысл, когда Вы работаете с пакетом. Но тогда указывается название пакета, а __init__.py просто лежит в нем. Кроме того в __init__.py есть возможность конфигурировать загрузку пакета и еще немножко няшностей
Strelok-den
4kpt_III
__init__.py это зарегистрированное имя. Я называю несущий файл в этом случае system.py или main.py.__init__.py имеет смысл, когда Вы работаете с пакетом. Но тогда указывается название пакета, а __init__.py просто лежит в нем. Кроме того в __init__.py есть возможность конфигурировать загрузку пакета и еще немножко няшностей

Ну не обязательно __init__.py можно что нибуть другое, главное чтоб импортируемый import модуль сработал так как будто он главный(первый) стартовал… В любом другом случаи выводит ошибки: RuntimeError: main thread is not in main loop

Что за няшности если не секрет?

P.s. уже 4kpt_III, а со старыми что?)
4kpt_III
Я не совсем понимаю Вашу ситуацию. Я делаю так. Создаю файл, который запускает базовый виджет (чаще всего это root с верхним меню) . Все остальные виджеты импортируются по необходимости при выборе нужного пункта меню. Строятся они, чаще всего либо на frame, либо на toplevel. В качестве аргумента я им передаю или весь root или его часть под меню (зависит от того, каким меню я пользовался - если встроенным - то весь root, если своим - то внутренний frame). Они уже на нем и строятся (используют или root или frame в качестве подложки). Классу, построенному на toplevel я не передаю ничего Вот про этот system.py я и писал. В любом моем проекте GUI является основным управляющим элементом. Все остальное строится уже на нем: вызов БД, создание или изменение файлов, подключение к сервисам или к сайтам и т.п.

P.S. Я каждую тысячу создаю новую учетку. Ну не подходит желтый цвет к цвету моих глаз Да и фотка эта хороша. Хоть на ней и самка
Strelok-den
4kpt_III
Я не совсем понимаю Вашу ситуацию. Я делаю так. Создаю файл, который запускает базовый виджет (чаще всего это root с верхним меню) . Все остальные виджеты импортируются по необходимости при выборе нужного пункта меню. Строятся они, чаще всего либо на frame, либо на toplevel. В качестве аргумента я им передаю или весь root или его часть под меню (зависит от того, каким меню я пользовался - если встроенным - то весь root, если своим - то внутренний frame). Они уже на нем и строятся (используют или root или frame в качестве подложки). Классу, построенному на toplevel я не передаю ничего Вот про этот system.py я и писал. В любом моем проекте GUI является основным управляющим элементом. Все остальное строится уже на нем: вызов БД, создание или изменение файлов, подключение к сервисам или к сайтам и т.п.

Хм а интересная структура) возьму на заметку) у меня почти похоже.. ток вместо импорта классы…

Попробую еще раз объяснить.. Мне по сути просто нужно(для примера): файл start.py в нем import dops.py, и больше ничего. Это мне нужно для того что бы скрыть исходники хоть чуток(специфика мак).
Но почему то при таком примере ткинтер перестает обрабатывать переданные переменные в любом потоке..

Нужно что бы при запуске start.py я не почувствовал разницу со стартом dops.py..

P.s. ясненько) тогда добавлю красоты в виде репы) а то 0… не смотриться
4kpt_III
Многопоточное приложение?
Strelok-den
4kpt_III
Многопоточное приложение?
Да
4kpt_III
Ну тогда сложно. Многопоточность и tkinter это вообще отдельная работа. Простое импортирование работает. Только что проверил. Как с threading я даже не знаю… Нужно именно копаться. Честно говоря я не сталкивался. Многопоточность дело нужно, но вот tkinter с ним прямо дружить не очень любит.
Strelok-den
4kpt_III
Ну тогда сложно. Многопоточность и tkinter это вообще отдельная работа. Простое импортирование работает. Только что проверил. Как с threading я даже не знаю… Нужно именно копаться. Честно говоря я не сталкивался. Многопоточность дело нужно, но вот tkinter с ним прямо дружить не очень любит.

С threading у меня так(это в dops.py):
from Tkinter import Tk, Text
from threading import Thread
root = Tk()
txt = Text(root, text='1111')
txt.pack()
def test(txt):
    txt.insert(INSERT, '22222')
    txt.configure(state='disabled') #RuntimeError: main thread is not in main loop
Thread(target=test, args=(txt, )).start()
root.mainloop()

http://tkinter.unpythonic.net/wiki/mtTkinter - вот это должно заставить Tkinter работать с многопоточностью.. Так ли оно или еще больше проблем будит с ним?
4kpt_III
Не знаю. Не пользовался. Попробуйте. Если поможет, то напишите - буду знать. Вообще многопоточность в tkinter реализуется не так. Главный mainloop нужно откреплять от тредовой системы. Я об этом писал. Приводил примеры. Можете поискать. Не найдете - напишите. Выложу код снова.

P.S. Мне хватало стандартных возможностей. Я просто использовал с учетом специфических особенностей tkinter.
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