Найти - Пользователи
Полная версия: tkinter виджет Frame
Начало » GUI » tkinter виджет Frame
1 2
jony_77
Как сделать чтобы виджет с новыми размерами был поверх других виджетов, сейчас получается только последний нормально отображается.
#!/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()
4kpt_II
В коде ошибка

tk.Frame.__init__(self, MainWindow)

Подумайте, что Вы здесь делаете.

P.S. Давайте так. Вы напишите, что Вы хотите получить и я смогу Вам помочь.
jony_77
Если словами объяснять, то как то так:
Нужно сделать родительское главное окно (синего цвета на весь экран). На нем сделать потомки виджеты (фреймы - цвета для наглядности). При нажатии мышой на любой из виджетов он должен поменять размер на больший и отобразиться Поверх остальных. При повторном нажатии встать обратно на свое место. В моем коде, только последний (четвертый) размещенный виджет (при нажатии на него) отображается поверх остальных. Предыдущий (третий) под четвертым, второй под третьим и четвертым, первый под всеми (как будто окно не в фокусе).
PS. С классами и ООП не сильно дружу, поэтому извиняйте, если что не так….
4kpt_II
Держите.

#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()

P.S. Будут вопросы - пишите…
jony_77
Спасибо! Работает.. Только мне не подойдет.. Вы делаете
event.widget.destroy()
это при каждом нажатии новый объект, а у меня к id виджета привязан subprocess.Popen (в коде не показано, дабы не усложнять), соответственно сторонний процесс умрет.
4kpt_II
Я думаю не умрет, если сделать его атрибутом. И потом атрибут переназначать на новый виджет.
jony_77
Как? Стороннее приложение - это mplayer. Сначала создается фрейм-родитель, потом узнаю его ID. Потом запускаю плеер с параметром - wid ‘ID процеса’. Он запускается в нужном окне-фрейме.
self.player=subprocess.Popen(('mplayer file.avi -wid %s'%self.winfo_id()).split())
Как сделать процесс атрибутом виджета? А потом назначить на новый виджет?
4kpt_II
Давайте так. Как Вы создаете окно-фрейм? Как связываете плеер с tkinter?
jony_77
Вот
#!/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()
4kpt_II
Звук слышу. Видео нет. Проверить реально не могу

Ага. Запустил. Теперь будем пробовать побороть
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