Найти - Пользователи
Полная версия: Многооконное приложение Tk
Начало » GUI » Многооконное приложение Tk
1 2 3
dbalor
Вот код главного окна:
 #!/usr/bin/env python3.6
from tkinter import*
from sys import*
import tkinter.ttk as ttk
import tkinter.messagebox as msg
from dtch import*
#класс главного окна
class main():
  def __init__(self, master):
    self.master = master
    self.master.title(u'Объект')
    self.master.minsize(width=900,height=500)
    self.master.maxsize(width=900,height=500)
    self.master.resizable(width=False, height=False)
    nb = ttk.Notebook(master)
    nb.pack(fill='both', expand='yes')
    f1 = Frame(master, width=900,height=400)
    frame_dtch=Frame(f1,width=900,height=300)
    btnCreate=Button(f1,text=u'Создать',command=self.mCreateDtch)
    btnCreate.place(x=0,y=0)
    frame_dtch.pack()
    f2 = Text(master)
    nb.add(f1,text=u'Датчики')
    nb.add(f2, text=u'page2')
    btnCancel=Button(self.master,text=u'Отмена',command=self.evCancel).pack(side=RIGHT)
    btnOk=Button(self.master,text=u'Ok',command=None).pack(side=RIGHT)
    self.master.mainloop()
  #Функция выхода из приложения без сохранения данных
  def evCancel(self):
    self.master.destroy()
  #Открываем новое окно
  def mCreateDtch(self):
	  self.dtch=dtch(self.master)
# создание окна
root = Tk()
# запуск окна
main(root)

А это код вызываемого окна по клику:
 from tkinter import*
from sys import*
import tkinter.ttk as ttk
import tkinter.messagebox as msg
class dtch():
    rows=2
    def __init__(self,master):
        listPar=['time','sats','speed','cource','altitude','lon','lat','avl_driver']
        self.win=Toplevel(master)
        self.win.title(u'Датчик')
        self.win.minsize(width=800,height=500)
        self.win.maxsize(width=800,height=500)
        nbf = ttk.Notebook(self.win)
        nbf.pack(fill='both', expand='yes')
        self.win.resizable(width=False, height=False)
        #Вкладка основное
        self.frameO=Frame(self.win,width=800,height=400)
        lName=ttk.Label(self.frameO,text='Имя*',width=30).grid(row=0,column=1,sticky=W, padx=10, pady=10)
        tName=Entry(self.frameO,width=50).grid(row=0,column=2,sticky=W, padx=10, pady=10)
        lType=Label(self.frameO,text=u'Тип датчика',width=30).grid(row=1,column=1,sticky=W, padx=10, pady=10)
        lIzm=Label(self.frameO,text=u'Еденица измерения:',width=30).grid(row=2,column=1,sticky=W, padx=10, pady=10)
        tIzm=Entry(self.frameO,textvariable=u'км',width=50).grid(row=2,column=2,sticky=W, padx=10, pady=10)
        lPar=Label(self.frameO,text=u'Параметр:',width=30).grid(row=3,column=1,sticky=W, padx=10, pady=10)
        cPar=ttk.Combobox(self.frameO,values = listPar,height=7,foreground='#FFFFFF',width=50)
        cPar.grid(row=3,column=2,sticky=W, padx=10, pady=10)
        lDir=Label(self.frameO,text=u'Описание',width=30).grid(row=4,column=1,sticky=W, padx=10, pady=10)
        tDir=Entry(self.frameO,width=50).grid(row=4,column=2)
        self.frameO.pack()
        # Вкладка Таблица расчетов
        self.frameX = Frame(self.win, width=800, height=400)
        self.frameXAB=Frame(self.frameX,width=400,height=400)
        btnAddXab=ttk.Button(self.frameXAB,text=u'Добавить',command=self.eAddXab).grid(row=0,column=1,sticky=W, padx=10, pady=10)
        btnDelXab = Button(self.frameXAB, text=u'Удалить', command=None).grid(row=0, column=2, sticky=W, padx=10, pady=10)
        lX1=Label(self.frameXAB,text='X*').grid(row=1,column=1,sticky=W, padx=10, pady=10)
        lA=Label(self.frameXAB,text=u'A*').grid(row=1,column=2,sticky=W, padx=10, pady=10)
        lB=Label(self.frameXAB,text=u'B').grid(row=1,column=3,sticky=W, padx=10, pady=10)
        btnDelAllXab = Button(self.frameXAB, text=u'', command=None).grid(row=1, column=4, sticky=W, padx=10, pady=10)
        self.frameXAB.grid(row=0,column=1)
        self.frameXY=Frame(self.frameX,width=400,height=400)
        chPareXY=Checkbutton(self.frameXY,text=u'Пары X и Y',command=None).grid(row=0, column=1, sticky=W, padx=10, pady=10)
        btnAddXY = Button(self.frameXY, text=u'Удалить', command=None).grid(row=0, column=3, sticky=W, padx=10, pady=10)
        lX2 = Label(self.frameXY, text=u'X*').grid(row=1, column=1, sticky=W, padx=10, pady=10)
        lY = Label(self.frameXY, text=u'Y*').grid(row=1, column=2, sticky=W, padx=10, pady=10)
        btnDelAllXY = Button(self.frameXY, text=u'', command=None).grid(row=1, column=3, sticky=W, padx=10, pady=10)
        self.frameXY.grid(row=0,column=2)
        self.frameX.pack(side=TOP)
        #Вкладка Графика
        self.frameGr=Frame(self.win, width=800, height=400)
        self.frameGr.pack(side=TOP)
        nbf.add(self.frameO,text=u'Основное')
        nbf.add(self.frameX,text='Таблица расчета')
        nbf.add(self.frameGr,text='График')
        btnCancel = Button(self.win, text=u'Отмена', command=self.eCancel).pack(side=RIGHT)
        btnOk = Button(self.win, text=u'Ok', command=None).pack(side=RIGHT)
        self.win.grab_set()
        self.win.focus_set()
        self.win.wait_window()
    def eCancel(self):
        self.win.destroy()
    def eAddXab(self):
        #b=self.frameX.grid.slaves()
        #msg.askokcancel('ff',b)
        b=rows+1
        btn = Button(self.frameX, text=u'',command=None).grid(row=b,column=4,sticky=W, padx=10, pady=10)
PEHDOM
dbalor
Вот код главного окна:….А это код вызываемого окна по клику:…
Ну вот я их поместил в один скрипт, второе окно всеравно отображается на панели задач.
приведите код в кототом оно не отображается, будем смотреть разницу.

dbalor
Ну вот я их поместил в один скрипт, второе окно всеравно отображается на панели задач.
приведите код в кототом оно не отображается, будем смотреть разницу.

У меня отображается! Вы не так поняли я говорю модальное окно не модальное, оно позволяет переходить на главное окно!(после разделения на два скрипта)

А до разделения скрипта оно было модальным! Как сделать его модальным в моем случае?

PEHDOM
dbalor
Вы не так поняли я говорю модальное окно не модальное, оно позволяет переходить на главное окно!(после разделения на два скрипта)

А до разделения скрипта оно было модальным! Как сделать его модальным в моем случае?
Хмм к сожалению не удалось повторить ошибку, при разделении на два модуля, второе окно остается модальным.
Может оно по разному ведет себя в разных системах? у меня сейчас венда, на линуксе смогу пртестить только послезавтра.

dbalor
Ok, протести пожалуйста. У меня убунту.

Под винду пока не знаю как компилить. Не подскажешь случаем как скомпилить под винду из линухи?
PEHDOM
dbalor
Под винду пока не знаю как компилить. Не подскажешь случаем как скомпилить под винду из линухи?
а зачем? пайтон, интерпретируемый ЯП, ставь пайтон для венды, и запускай свой .py файл на венде.
PEHDOM
Хмм действительно под линем модальное окно нифига не модальное, погуглил, это вовсе не косяк пайтона или ткинтера, а особености линукса с его зоопаком DE. Потому как элементы управления на оконной рамке фактически управляется не клиентским приложением (из X11), но оконным менеджером.
как вариант можно добавить в dtch
 class dtch()
    ...
    def __init__(self,master):
        ....
        self.win.transient(master) # Сделать окно "зависимым" от master
        self.win.grab_set()
        ....

это должно помочь, так как метод transient делает окно “зависимым”(лучшего перевода не смог подобрать) от главного окна, а в венде кроме всего прочего это окно не будет отображаться на панели задач. “Зависимое” окно всегда поверх главного, и будет автоматически скрыто если главное закроется или свернеться.
http://effbot.org/tkinterbook/wm.htm#Tkinter.Wm.transient-method
Правда, говорят, может быть ситуация, опять же изза ззопарка DE в *nix, когда “зависимое” окно останется работать при закрытии главного. Тогда нужно писать калбек функцию на закрытие главного окна, чтобы она также закрывала дочернее.
пример https://stackoverflow.com/questions/16803686/how-to-create-a-modal-dialog-in-tkinter

Rodegast
> под линем модальное окно нифига не модальное, погуглил, это вовсе не косяк пайтона или ткинтера, а особености линукса с его зоопаком DE

Тогда почему у других тулкитов с этим всё нормально.

> Под винду пока не знаю как компилить. Не подскажешь случаем как скомпилить под винду из линухи?

http://python.su/forum/topic/35453/?page=1#post-192803

P.S. tkinter это самый душманский тулкит из всех существующих. Советую использовать вместо него что-то другое.
PEHDOM
Rodegast
Тогда почему у других тулкитов с этим всё нормально.
Это вопрос философский, я могу тогда спросить почему тогда под вендой оно работает, а под линуксом нет? либа то одна и таже что под вынь что под линь.
Rodegast
> почему тогда под вендой оно работает, а под линуксом нет

Потому что у tkinter-а проблемы с кроссплатформенностью. Это лишний раз доказывает что 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