Найти - Пользователи
Полная версия: не работают флажки и переключатели в Tkinter
Начало » GUI » не работают флажки и переключатели в Tkinter
1
Dr.Livsi
Доброе время суток!

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

Папка программы (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()
Если таким образом импортировать и затем открывать формы из модулей, то почему-то не работают флажки и переключатели (т.е. используется только первоначально заданное значение).
При этом если модуль с отчетом запускать самостоятельно - флажки и переключатели работают.
С чем может быть связано такое поведение программы?
4kpt
Как ты вызываешь после импортирования?
Dr.Livsi
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)
4kpt
Попробуй метод __call__ описать после __init__ в классе, который вызываешь… Для задачи вызова отдельных частей одного модуля в другом я использую его. У меня такое ощущение, что ты вызываешь класс без методов но с состоянием.
Dr.Livsi
Собственно да, вызываемые классы имеют собственные методы, но они используются в рамках процедур самого класса. При определении экземпляра класса (app=MyClass(master=Tk())) в процедуре запуска никакие методы не задействуются. Не понятно, что прописывать в методе __call__
Dr.Livsi
похоже все таки дело не в этом:
если сделать скрипт, который будет импортировать процедуру, запускающую класс с формой вот такого вида:
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, которая должна открыть форму. Форма открывается, но переключатели уже не работают.
4kpt
Возможно я все не так понимаю и поэтому повторяюсь: для запуска отдельных частей одного модуля при работе другого ты все как-то витиевато делаешь. Много проще использовать прямой вызов через метод __call__ с передачей определенных параметров, и соответственно с возвращением определенного набора значений (набора - в смысле группы). Зачем в этой задаче использовать наследование (я не до конца понимаю) - ты же фактически не модернизируешь суперклас в связи з тем-то и тем-то, а просто используешь функциональность предыдущего класа. Зачем же тогда наследовать? Легче написать модульную систему и не париться…
sp3
Dr.Livsi
то почему-то не работают  флажки и переключатели
Без кода(урезанного, с теми самыми флажками), можно посоветовать почитать документацию или умную книжку.
У меня, например, работают флажки и переключатели.
4kpt
sp3
Ну да… Хотя мне кажеться, причина в отдельном выносе функции запуска класса (зачем?) вне класса. Потом выполняется последующий вызов класса через функцию для использования его методов???? Как-то все очень сложно. Если нужно использовать класс - пожалуйста - сделайте прямой вызов, а в качестве аргумента передайте root (в смысле Tkinter.Tk()) что-бы объект отображался, ну или как-то так…

P.S. Простите за бла-бла-бла. Просто очень хорошее настроение…
Dr.Livsi
буду упрощать код и выложу пример
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