Форум сайта python.su
Как сделать чтобы виджет с новыми размерами был поверх других виджетов, сейчас получается только последний нормально отображается.
#!/usr/bin/python3.4 # -*- coding: utf-8 -*- import tkinter as tk num = 4 posx = [0, 960, 0, 960] posy = [0, 0, 540, 540] color = ['red','black','white','yellow'] sx = 960 sy = 540 class MainFrame(tk.Tk): def __init__ (self): tk.Tk.__init__(self) self.config(bg='blue') self.attributes('-fullscreen', True) class WinFrame(tk.Frame): def __init__(self): tk.Frame.__init__(self, MainWindow) self.x = posx[i] self.y = posy[i] self.config(width=sx, height=sy, bg=color[i]) self.place(x=self.x, y=self.y) self.bind('<Button-1>', self.on_screen) def on_screen(self, event): if self.winfo_width()==sx: self.config(width=1600, height=900) self.place(x=100, y=50) else: self.config(width=sx, height=sy) self.place(x=self.x, y=self.y) if __name__ == '__main__': MainWindow= MainFrame() i = 0 while i < num: WinCam = WinFrame() i=i+1 MainWindow.mainloop()
Офлайн
В коде ошибка
tk.Frame.__init__(self, MainWindow)
Отредактировано 4kpt_II (Окт. 2, 2014 17:20:40)
Офлайн
Если словами объяснять, то как то так:
Нужно сделать родительское главное окно (синего цвета на весь экран). На нем сделать потомки виджеты (фреймы - цвета для наглядности). При нажатии мышой на любой из виджетов он должен поменять размер на больший и отобразиться Поверх остальных. При повторном нажатии встать обратно на свое место. В моем коде, только последний (четвертый) размещенный виджет (при нажатии на него) отображается поверх остальных. Предыдущий (третий) под четвертым, второй под третьим и четвертым, первый под всеми (как будто окно не в фокусе).
PS. С классами и ООП не сильно дружу, поэтому извиняйте, если что не так….
Офлайн
Держите.
#coding: utf-8 # import Tkinter # # def callback(event): position, w_color = event.widget.position, event.widget["bg"] if int(event.widget["width"]) == 100: new_x = 0.5 new_size = [400, 400] else: new_x = position new_size = [100, 100] event.widget.destroy() widget = Tkinter.Frame(width=new_size[0], height=new_size[1], bg=w_color) widget.position = position widget.bind("<ButtonRelease-1>", callback) widget.place(relx=new_x, rely=0.5, anchor="center") # root = Tkinter.Tk() root.title(u"Клиенты-заказы") root.attributes("-fullscreen", True) # for pos, color in enumerate(["red", "green", "yellow", "white", "magenta"]): new_frame = Tkinter.Frame(root, width=100, height=100, bg=color) new_frame.position = 0.166 * (pos + 1) new_frame.place(relx=new_frame.position, rely=0.5, anchor="center") new_frame.bind("<ButtonRelease-1>", callback) # root.mainloop()
Офлайн
Спасибо! Работает.. Только мне не подойдет.. Вы делаете
event.widget.destroy()это при каждом нажатии новый объект, а у меня к id виджета привязан subprocess.Popen (в коде не показано, дабы не усложнять), соответственно сторонний процесс умрет.
Отредактировано jony_77 (Окт. 3, 2014 14:17:07)
Офлайн
Я думаю не умрет, если сделать его атрибутом. И потом атрибут переназначать на новый виджет.
Офлайн
Как? Стороннее приложение - это mplayer. Сначала создается фрейм-родитель, потом узнаю его ID. Потом запускаю плеер с параметром - wid ‘ID процеса’. Он запускается в нужном окне-фрейме.
self.player=subprocess.Popen(('mplayer file.avi -wid %s'%self.winfo_id()).split())
Офлайн
Давайте так. Как Вы создаете окно-фрейм? Как связываете плеер с tkinter?
Офлайн
Вот
#!/usr/bin/python3.4 # -*- coding: utf-8 -*- import tkinter as tk import subprocess num = 5 myfile = '/home/jon/1.MTS' cmdline='mplayer -vo vaapi -cache 1024 -fps 30 -wid %s %s' posx = [1, 481, 961, 1441, 1, 481, 961, 1441, 1, 481, 961, 1441, 1, 481, 961, 1441] posy = [1, 1, 1, 1, 271, 271, 271, 271, 541, 541, 541, 541, 811, 811, 811, 811] sx = 479 sy = 269 class WinFrame(tk.Frame): def __init__(self): tk.Frame.__init__(self, None) self.x, self.y = posx[i], posy[i] self.config(width=sx, height=sy) self.place(x=self.x, y=self.y) self.cmdline_win=cmdline%(self.winfo_id(), myfile) self.player=subprocess.Popen(self.cmdline_win.split()) self.bind('<Button-1>', self.on_fullscreen) def on_fullscreen(self, event): if self.winfo_width()==sx: self.config(width=1600, height=900) self.place(x=100, y=50) else: self.config(width=sx, height=sy) self.place(x=self.x, y=self.y) if __name__ == '__main__': root = tk.Tk() root.config(bg='blue') root.attributes("-fullscreen", True) for i in range(num): WinCam = WinFrame() root.mainloop()
Отредактировано jony_77 (Окт. 6, 2014 15:05:37)
Офлайн
Звук слышу. Видео нет. Проверить реально не могу
Ага. Запустил. Теперь будем пробовать побороть
Отредактировано 4kpt_II (Окт. 6, 2014 17:28:04)
Офлайн