Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2018 00:23:49

dbalor
Зарегистрирован: 2018-07-02
Сообщения: 73
Репутация: +  0  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

Вот код главного окна:

 #!/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)

Офлайн

#2 Июль 9, 2018 09:20:48

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

dbalor
Вот код главного окна:….А это код вызываемого окна по клику:…
Ну вот я их поместил в один скрипт, второе окно всеравно отображается на панели задач.
приведите код в кототом оно не отображается, будем смотреть разницу.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Июль 10, 2018 05:50:23

dbalor
Зарегистрирован: 2018-07-02
Сообщения: 73
Репутация: +  0  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

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

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

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

Офлайн

#4 Июль 10, 2018 10:29:00

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

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

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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Июль 11, 2018 03:34:40

dbalor
Зарегистрирован: 2018-07-02
Сообщения: 73
Репутация: +  0  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

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

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

Офлайн

#6 Июль 11, 2018 09:56:15

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

dbalor
Под винду пока не знаю как компилить. Не подскажешь случаем как скомпилить под винду из линухи?
а зачем? пайтон, интерпретируемый ЯП, ставь пайтон для венды, и запускай свой .py файл на венде.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Июль 11, 2018 13:21:37

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

Хмм действительно под линем модальное окно нифига не модальное, погуглил, это вовсе не косяк пайтона или ткинтера, а особености линукса с его зоопаком 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



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июль 11, 2018 14:04:55)

Офлайн

#8 Июль 11, 2018 14:38:41

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2685
Репутация: +  182  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

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

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

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

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

P.S. tkinter это самый душманский тулкит из всех существующих. Советую использовать вместо него что-то другое.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июль 11, 2018 14:41:51)

Офлайн

#9 Июль 11, 2018 14:47:11

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

Rodegast
Тогда почему у других тулкитов с этим всё нормально.
Это вопрос философский, я могу тогда спросить почему тогда под вендой оно работает, а под линуксом нет? либа то одна и таже что под вынь что под линь.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июль 11, 2018 14:49:44)

Офлайн

#10 Июль 11, 2018 15:09:18

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2685
Репутация: +  182  -
Профиль   Отправить e-mail  

Многооконное приложение Tk

> почему тогда под вендой оно работает, а под линуксом нет

Потому что у tkinter-а проблемы с кроссплатформенностью. Это лишний раз доказывает что tkinter-ом пользоваться не надо.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version