Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141

Обновить Frame

29.03.2024, 11:36. Показов 864. Ответов 17

Студворк — интернет-сервис помощи студентам
Требуется помощь в обновлении Frame
Кусочек кода присвоения Frame
Python
1
self.videopanel = ttk.Frame(self.parent)
Получаю нужный результат


При выборе нового канала (ссылки слева) удаляю панель
Python
1
self.videopanel.destroy()
Создаю новую self.videopanel = ttk.Frame(self.parent) с новым каналом и получаю проблему - панель располагается поверх элементов.


Вопрос?! Как мне не удалять панель self.videopanel = ttk.Frame(self.parent) а просто обновить, что бы позиции элементов сохранились в первоначальном порядке.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2024, 11:36
Ответы с готовыми решениями:

Запрос данных из Frame
Доврый вечер! Возникла следующая проблема: мне надо при помощи кнопки запустить другой файл и передать в него данные. Ниже кнопка...

Преобразование video frame в байтовый массив в питоне
подскажите, предположим, есть тестовое видео https://drive.google.com/file/d/1_DcwBhYo15j7AU-v2gN61qGGd1ZablGK/view Как я могу...

PyQT+OpenCV frame
Кадр видео не помещается полностью в Qlabel, как можно исправить? Проблема в opencv или в qt?

17
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
29.03.2024, 12:39  [ТС]
На просторах интернет рекомендуют:
Не обновлять Frame, а менять поток видео.
Вопрос! Как это выполнить?
Есть кусок кода:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
self.videopanel = ttk.Frame(self.parent)
 
self.canvas = Tk.Canvas(self.videopanel).pack(fill=Tk.BOTH, expand=1)
self.videopanel.pack(fill=Tk.BOTH, expand=1)
 
self.Instance = vlc.Instance('--no-xlib --quiet')
self.player = self.Instance.media_player_new()
self.Media = self.Instance.media_new(self.url)
self.player.set_media(self.Media)
 
self.player.set_hwnd(self.videopanel.winfo_id())
self.player.audio_set_volume(60)
self.player.play()
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
30.03.2024, 00:40  [ТС]
Вопрос выше я решил.
Подскажите синтаксис!? Мне нужно при формировании List добавить count
Python
1
2
3
count += 1
if ll[0].find("group-title") >= 0:
    list_name.append(uu+', '+count)
Запятую с пробелом добавляю, а на count ругается
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,316
30.03.2024, 04:59
count нужно добавлять как str(count), то есть преобразуя в строку
1
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
30.03.2024, 10:32  [ТС]
Ципихович Эндрю - спасибо за ответ.

Нарисовался еще один вопрос!?
У Button вызывается функция self.play_video(1)
Python
1
2
self.open_button = tk.Button(text="Открыть файл", command= lambda: self.play_video(1))
self.open_button.pack()
У Label не могу присвоить событие
Python
1
2
3
w = tk.Label(self.canvas1, text="Канал 1")
w.bind("<ButtonPress-1>", self.play_video(1))
w.pack(fill='both', pady=3)
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
31.03.2024, 10:17  [ТС]
C предыдущим вопросом разобрался - логика была нарушена.
Сейчас снова стоит вопрос в синтаксисе. Есть for в котором формируются Label c вызовом функции.
Python
1
2
3
4
5
6
        for i, e in enumerate(list_name):
            ll = e.split(",")
            nn = str(i)
            w = tk.Label(self.canvas1, text=nn + "   " + ll[1])
            w.pack(fill='both', pady=3)
            w.bind("<ButtonPress-1>", lambda e: self.parent.after(1, self.play_video(int(i))))
Проблема заключается в том, что при клик на любой Label функция self.play_video() передает последнее значение.
Хотя на фото ниже, перед названием канала я вывожу i из for и оно верное


Сам вопрос!?
С чем это может быть связано?
Может ли это связано с тем, что используется одна переменная w для Label.
Если это так, то как мне дописывать к переменной к примеру i в цикле (синтаксис?), что бы избежать повторения
Python
1
2
        for i, e in enumerate(list_name):
            w +.i  = tk.Label(self.canvas1, text="")
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,316
31.03.2024, 10:48
cosmos44, вы кормите форумчан кусочками........кода
Цитата Сообщение от cosmos44 Посмотреть сообщение
for i, e in enumerate(list_name):
            w +.i  = tk.Label(self.canvas1, text="")
что за точка перед i?
что находится в w?
почему после знака + нет пробела?
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
31.03.2024, 12:21  [ТС]
что за точка перед i?
что находится в w?
почему после знака + нет пробела?


Одним словом, мне нужно:
в цикле формировать w = tk.Label(self.canvas1, text=""), но при этом избежать повторения переменной w
Поэтому я пытаюсь в цикле переменной w дописать kye
что бы получить в результате примерно так:
Python
1
2
3
4
w0 = tk.Label(self.canvas1, text="")
w1 = tk.Label(self.canvas1, text="")
w2 = tk.Label(self.canvas1, text="")
...
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,316
31.03.2024, 12:48
"w" + str(i)
хотя стоп
далее то, что будет происходить?

Добавлено через 7 минут
ведь w0 w1 w2 будут равны между собой и зачем их плодить?
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
02.04.2024, 13:22  [ТС]
Проблемы в данный момент такова!
Вывожу в окно:
""" Вывод меню каналов TV"""
self.menu_tv(list_name)
Соответственно каждому каналу присваиваю номер соответствующий листу url_videos = []
self.play_video(0)
self.play_video(1)
...

В результате кликая на любой канал из меню Каналов. В функцию self.play_video(1) всегда передается номер последнего канала. Хотя по факту в данном примере self.play_video(1) передается 1

Вывод каналов
https://www.cyberforum.ru/atta... 711868991t

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import tkinter as tk
import sys
import os
 
import pathlib
 
import vlc
 
_isMacOS = sys.platform.startswith('darwin')
_isWindows = sys.platform.startswith('win')
_isLinux = sys.platform.startswith('linux')
 
 
class VideoPlayer:
    def __init__(self, parent, url_videos, list_name):
        self.parent = parent  # == root
        self.video_frame = tk.Frame(self.parent)
        self.canvas = tk.Canvas(self.video_frame)
        self.canvas.pack(fill=tk.BOTH, expand=1)
        self.show()
 
        # VLC player
        #args = []
        #if _isLinux:
            #args.append('--no-xlib')
            #args.append('--vout=mmal_vout')
 
        self.Instance = vlc.Instance('--no-xlib --quiet')
 
        self.player = self.Instance.media_player_new()
        ############self.player.video_set_mouse_input(True)
 
        self.playlist = self.Instance.media_list_player_new()
 
        #########self.set_play_mode(0)
        self.playlist.set_media_player(self.player)
 
        self.media_list = self.Instance.media_list_new(url_videos)
 
        self.playlist.set_media_list(self.media_list)
 
        h = self.canvas.winfo_id()  # .winfo_visualid()?
        if _isWindows:
            self.player.set_hwnd(h)
        elif _isLinux:
            self.player.set_xwindow(h)  # fails on Windows
        #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
        """ Вывод меню каналов TV"""
        self.menu_tv(list_name)
 
        # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        self.open_button = tk.Button(text="Открыть канал 188", command= lambda: self.play_video(188))
        self.open_button.pack()
 
 
    def stop(self, event=None):
        self.playlist.play_item_at_index(1)
        self.set_play_mode(0)
 
 
    def show(self):
        if not self.video_frame.winfo_viewable():
            self.video_frame.pack(fill=tk.BOTH, expand=1)
 
    def hide(self):
        self.video_frame.pack_forget()
 
 
    def play_video(self, index):
        print(index)
        itm = self.media_list.item_at_index(index)
        self.player.set_media(itm)
        output = self.playlist.play_item(itm)
 
 
    def set_play_mode(self, mode):
        self.playlist.set_playback_mode(mode)
        
    """ Меню каналов TV """
    def menu_tv(self, list_name):
        self.canvas1 = tk.Canvas(root, bg="SkyBlue", bd=0, highlightthickness=0)
        self.canvas1.place(width=300, anchor=tk.NW)
        for i, e in enumerate(list_name):
            ll = e.split(",")
            nn = str(i)
            w = "w"+nn
            w = tk.Label(self.canvas1, text=nn + "   " + ll[1], bg="DodgerBlue", fg="white", anchor='w',
                          font=("Arial", 12))
            w.pack(fill='both', pady=3)
            # w.bind("<ButtonPress-1>", self.play_video(3))
            w.bind("<ButtonPress-1>", lambda e: self.parent.after(1, self.play_video(int(i))))
 
 
 
 
 
#=============================================================================
 
 
 
def open_url():
    #print('2')
    fileOP = pathlib.Path(r"tvm3x.m3u8")
    with fileOP as f: text = f.read_text(encoding='utf-8')
    lines = text.splitlines()
    url_videos = [] # List URL каналов TV
    list_name = [] # List инфо каналов TV
    for i, line in enumerate(lines):
        if line.find("http") >= 0:
            url_videos.append(line)
        if line.find("group-title=") >= 0:
            list_name.append(line)
    return url_videos, list_name
 
def startup():
    url_videos, list_name = open_url()
    #print('1')
    #url_videos = [
        #"http://10.242.0.7:8000/pervyj_kanal",
        #"http://10.242.0.7:8000/match_tv",
        #"http://10.242.0.7:8000/rossiya_24"
    #]
 
    movie_player = VideoPlayer(root, url_videos, list_name)
    #movie_player.set_play_mode(1)
    #movie_player.play_video(0)
 
 
if __name__ == '__main__':
    root = tk.Tk()
    root.geometry("800x600")
 
    root.after(1000, startup)
    root.mainloop()
Добавлено через 2 часа 37 минут
Поставлю вопрос короче!
list_name [] - лист содержит 200 значений
Участок кода:
Python
1
2
3
4
5
6
7
8
9
10
11
12
    def menu_tv(self, list_name):
        self.canvas1 = tk.Canvas(root, bg="SkyBlue", bd=0, highlightthickness=0)
        self.canvas1.place(width=300, anchor=tk.NW)
        for i, e in enumerate(list_name):
            ll = e.split(",")
            nn = str(i)
            w = "w"+nn
            w = tk.Label(self.canvas1, text=nn + "   " + ll[1], bg="DodgerBlue", fg="white", anchor='w',
                          font=("Arial", 12))
            w.pack(fill='both', pady=3)
            # w.bind("<ButtonPress-1>", self.play_video(3))
            w.bind("<ButtonPress-1>", lambda e: self.parent.after(0, self.play_video(int(i))))
Последняя строка кода: w.bind("<ButtonPress-1>", lambda e: self.parent.after(0, self.play_video(int(i))))
Вопрос!? В чем ошибка? При клике на любой сформированный в цикле (0, self.play_video(int(i))) присваивается последнее значение из list_name [] - 200
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,316
02.04.2024, 14:13
cosmos44,
строку № 7 можно выбросить от неё толку ноль, Вы это понимаете?
в ней Вы задали значение для w, а строкой ниже обновили значение w на другое
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
02.04.2024, 14:24  [ТС]
Строкой №7 я формирую переменные, что бы избежать повторения переменной w
print(W)
w0
w1
w2
w3
w4
w5
w6
w7
...
таким образом я пытался исправить проблему self.play_video(int(i)) которую я описал выше. Но это не помогло!
Я думал, что повторение переменной w может влиять на вызов self.play_video(int(i)) а именно на int(i)
Проблема - запись в переменную происходит верное, а вот передается всегда последнее значение из списка
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,316
02.04.2024, 14:28
Цитата Сообщение от cosmos44 Посмотреть сообщение
Строкой №7 я формирую переменные
сие в пионе не прокатит
раз есть список list_name то передавать нужно его какое-то из значений list_name[х], отсчёт от 0
наверное - list_name[i]
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
02.04.2024, 15:12  [ТС]
PRINT() по всем значениям дает верные данные (for i, e in enumerate(list_name):)

print(int(i))
0
1
2
3
4
5
Это те данные которые присваиваются функции self.play_video(int(i)) и тут все верно.

Но функция принимает всегда значение 200 (конечный результат int(i))

def play_video(self, index):
print(index)
200
200
200
...
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,316
02.04.2024, 16:23
Цитата Сообщение от cosmos44 Посмотреть сообщение
print(int(i))
здесь int - лишний, int\str нужны когда что-то совершаете с данными, но никак не печатаете
Цитата Сообщение от cosmos44 Посмотреть сообщение
Но функция принимает всегда значение 200 (конечный результат int(i))
ну так смоделируйте себе небольшой кусочек кода с циклом и функцией - без вашей лабуды и поймёте что и как........
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
02.04.2024, 17:26  [ТС]
Понял! Сейчас буду пробовать!
Подскажите! Почему не отрабатывает такая конструкция?
Python
1
2
3
4
5
6
w = tk.Label(self.canvas1, text='Text")
w.pack(fill='both', pady=3)
w.bind("<ButtonPress-1>", lambda m = "Test": self.parent.after(1, self.play_videoO(m)))
 
def play_videoO(self, m):
     print(m)
print(m):
<ButtonPress event state=Mod1 num=1 x=88 y=15>
<ButtonPress event state=Mod1 num=1 x=78 y=6>
<ButtonPress event state=Mod1 num=1 x=56 y=4>

Хотелось бы получить "Test"

Добавлено через 29 минут
Сделал как вы и советовали! Убрал всю лабуду
Python
1
2
3
4
5
6
7
8
9
10
11
12
import tkinter as tk
root = tk.Tk()
list_name = [1 , 2, 3, 4]
 
for i, e in enumerate(list_name):
    w = tk.Label(root, text=e, bg="DodgerBlue", fg="white", anchor='w', font=("Arial", 12))
    w.pack(fill='both', pady=3)
    w.bind("<ButtonPress-1>", lambda e: root.after(1, play_videoO(i)))
def play_videoO(i):
    print(i)
 
root.mainloop()
При клике на любой w = tk.Label() - print() - выдает всегда 3 (последний ключ из list_name)
А мне нужно выдавать присвоиные ключи 0 - 1 - 2 - 3
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,316
02.04.2024, 20:42
так строки 9 и 10 НЕ входят же в цикл (строки 5-8) работают сами по себе
1
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
02.04.2024, 22:03  [ТС]
GPT дал мне нужный ответ. Вам (Ципихович Эндрю) - спасибо за отклик на мои вопросы

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import tkinter as tk
 
 
def on_label_click(event, key):
    print(f"Label clicked: {key}")
 
root = tk.Tk()
list_name = ["a", "b", "c", "d"]
 
for key in list_name:
    label = tk.Label(root, text=key)
    label.bind("<ButtonPress-1>", lambda event, key=key: on_label_click(event, key))
    label.pack()
 
root.mainloop()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2024, 22:03
Помогаю со студенческими работами здесь

Расположение рамок (Frame)
Добрый день! Мне вновь требуется ваша помощь. Сразу к сути дела: у меня есть окно, в нем расположена вкладка, а в ней я хочу расположить...

Checkbutton во Frame не работает
Я новичок и пишу на PyCharm 2017.1 интерпритатор PYTHON 3.8.6rc1 Облазил, как мне кажется весь интернет, но решение проблемы не нашел....

Не отображается Label внутри Frame
Привет всем, Я только учусь программировать и не могу понять в чем ошибка. Текст не отображается внутри Frame если кто знает из-за чего...

Создание подкласса Frame-а tkinter
В учебнике М.Доусона есть вот такой код from tkinter import * root=Tk() root.geaometry(&quot;100x50&quot;) class Aplication(Frame): def...

tkinter как удалить frame
Доброго времени суток. Помогите с проблемой Как удалить динамически создаваемый фрейм? Вот код который работает как надо. Тыкаю на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru