Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 22, 2014 13:49:00

Strelok-den
Зарегистрирован: 2014-03-25
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

Есть код(приводить нет смысла) с использованием 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..

Спасибо)

Офлайн

#2 Дек. 22, 2014 14:17:09

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

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

Офлайн

#3 Дек. 22, 2014 14:27:09

Strelok-den
Зарегистрирован: 2014-03-25
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

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, а со старыми что?)

Офлайн

#4 Дек. 22, 2014 14:54:38

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

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

P.S. Я каждую тысячу создаю новую учетку. Ну не подходит желтый цвет к цвету моих глаз Да и фотка эта хороша. Хоть на ней и самка

Отредактировано 4kpt_III (Дек. 22, 2014 14:55:32)

Офлайн

#5 Дек. 22, 2014 15:05:19

Strelok-den
Зарегистрирован: 2014-03-25
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

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… не смотриться

Офлайн

#6 Дек. 22, 2014 15:12:37

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

Многопоточное приложение?

Офлайн

#7 Дек. 22, 2014 15:13:05

Strelok-den
Зарегистрирован: 2014-03-25
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

4kpt_III
Многопоточное приложение?
Да

Офлайн

#8 Дек. 22, 2014 15:21:42

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

Ну тогда сложно. Многопоточность и tkinter это вообще отдельная работа. Простое импортирование работает. Только что проверил. Как с threading я даже не знаю… Нужно именно копаться. Честно говоря я не сталкивался. Многопоточность дело нужно, но вот tkinter с ним прямо дружить не очень любит.

Офлайн

#9 Дек. 22, 2014 15:32:16

Strelok-den
Зарегистрирован: 2014-03-25
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

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 работать с многопоточностью.. Так ли оно или еще больше проблем будит с ним?

Офлайн

#10 Дек. 22, 2014 15:38:46

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter и import в __init__.py

Не знаю. Не пользовался. Попробуйте. Если поможет, то напишите - буду знать. Вообще многопоточность в tkinter реализуется не так. Главный mainloop нужно откреплять от тредовой системы. Я об этом писал. Приводил примеры. Можете поискать. Не найдете - напишите. Выложу код снова.

P.S. Мне хватало стандартных возможностей. Я просто использовал с учетом специфических особенностей tkinter.

Отредактировано 4kpt_III (Дек. 22, 2014 15:39:44)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version