Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » не работают флажки и переключатели в Tkinter [RSS Feed]

#1 Дек. 19, 2011 13:31:20

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

Доброе время суток!

Есть программа, имеющая следующую структуру:

Папка программы (C:\\MyLittleProgramm - дело происходит под виндой):
my_little_programm.py - файл, содержащий меню программы
Подпапки:
- common - модуль с общими функциями и классами, используемыми в большинстве модулей программы (common_func.py, __init__.py)
- face - модуль, содержащий классы для формирования GUI программы (используется во всех остальных модулях module1-module4)
- module1 (modules1_func.py, __init__.py)
- module2
- module3
- module4

module1-module4 - модули, реализующие различный функционал программы. Файлы modules1_func.py имеют приблизительно следщующую структуру:

from Tkinter import *

def func1() - определяем одну функцию
def func2() - определяем вторую функцию
def func3() - определяем 3-ю функцию

class MyClass(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack({'padx':5, 'pady':5})

внутри этого класса имеются такие элементы, как флажки и переключатели



def open_myclass():
app=MyClass(master=Tk())
app.master.title(u'Модуль N: афигенно-сложные расчеты того-то')
app.mainloop()
Главный файл (C:\\MyLittleProgramm\my_little_programm.py) представляет собой меню из которого
осуществляется вызов функций вида “open_myclass()” представленной выше.
структура главного файла (my_little_programm.py):

import os, sys
sys.path.append(os.path.dirname(__file__))

from module1.modules1_func import open_myclass11
from module2.modules1_func import open_myclass12


root = Tk()

root.title(u'Моя программулинка')

bar=Menu(root)

menu1 = Menu(bar)
menu1 .add_command(label=u"Отчет 1...", command=open_myclass11)
menu1 .add_command(label=u"Отчет 2...", command=open_myclass12)
...

root.config(menu=bar)
root.mainloop()
Если таким образом импортировать и затем открывать формы из модулей, то почему-то не работают флажки и переключатели (т.е. используется только первоначально заданное значение).
При этом если модуль с отчетом запускать самостоятельно - флажки и переключатели работают.
С чем может быть связано такое поведение программы?



Офлайн

#2 Дек. 20, 2011 00:04:41

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

Как ты вызываешь после импортирования?



Офлайн

#3 Дек. 20, 2011 08:42:44

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

4kpt
Как ты вызываешь после импортирования?
Вообще в коде выше указано:
from module1.modules1_func import open_myclass11
...
menu1.add_command(label=u"Отчет 1...", command=open_myclass11)
Еще использую такой вариант:
определяю функцию в самом модуле с меню и туда добавляю функцию из модуля, запускающую форму.
Например

from module2.modules1_func import open_myclass21
...

def newdef():
print u'Запускаем форму для отчета 2'
open_myclass21()
...

menu1.add_command(label=u"Отчет 2...", command=newdef)



Отредактировано (Дек. 20, 2011 08:45:36)

Офлайн

#4 Дек. 20, 2011 09:11:26

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

Попробуй метод __call__ описать после __init__ в классе, который вызываешь… Для задачи вызова отдельных частей одного модуля в другом я использую его. У меня такое ощущение, что ты вызываешь класс без методов но с состоянием.



Офлайн

#5 Дек. 20, 2011 12:36:56

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

Собственно да, вызываемые классы имеют собственные методы, но они используются в рамках процедур самого класса. При определении экземпляра класса (app=MyClass(master=Tk())) в процедуре запуска никакие методы не задействуются. Не понятно, что прописывать в методе __call__



Офлайн

#6 Дек. 20, 2011 14:53:53

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

похоже все таки дело не в этом:
если сделать скрипт, который будет импортировать процедуру, запускающую класс с формой вот такого вида:

import os, sys
sys.path.append(os.path.dirname(__file__))

from module1.modules1_func import open_myclass11

if __name__=='__main__': open_myclass11()
Т.е. сам по себе скрипт не будет иметь никакой формы - в этом случае все флажки и переключатели - все работает.

однако если немного модернизировать скрипт, добавить туда tkinter форму:
import os, sys
sys.path.append(os.path.dirname(__file__))

from module1.modules1_func import open_myclass11

def asdf():
root=Tk()
btn=Button(root, width=20, text=u'кнопка1')
btn.bind('<Button-1>', lambda _: open_myclass11())
btn.pack()
root.mainloop()

if __name__=='__main__': asdf()
То из полученной формы с одной кнопкой мы запускаем процедуру open_myclass11 из модуля module1.modules1_func, которая должна открыть форму. Форма открывается, но переключатели уже не работают.



Офлайн

#7 Дек. 20, 2011 18:12:34

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

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



Офлайн

#8 Дек. 20, 2011 23:16:33

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

Dr.Livsi
то почему-то не работают  флажки и переключатели
Без кода(урезанного, с теми самыми флажками), можно посоветовать почитать документацию или умную книжку.
У меня, например, работают флажки и переключатели.



Офлайн

#9 Дек. 21, 2011 18:56:21

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

sp3
Ну да… Хотя мне кажеться, причина в отдельном выносе функции запуска класса (зачем?) вне класса. Потом выполняется последующий вызов класса через функцию для использования его методов???? Как-то все очень сложно. Если нужно использовать класс - пожалуйста - сделайте прямой вызов, а в качестве аргумента передайте root (в смысле Tkinter.Tk()) что-бы объект отображался, ну или как-то так…

P.S. Простите за бла-бла-бла. Просто очень хорошее настроение…



Отредактировано (Дек. 21, 2011 18:59:08)

Офлайн

#10 Дек. 23, 2011 07:47:50

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

не работают флажки и переключатели в Tkinter

буду упрощать код и выложу пример



Офлайн

  • Начало
  • » GUI
  • » не работают флажки и переключатели в Tkinter[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version