Python tkinter не выполняет команды кнопок на Raspberry PiPython

Программы на Python
Ответить
Anonymous
 Python tkinter не выполняет команды кнопок на Raspberry Pi

Сообщение Anonymous »

Я разрабатываю приложение для выбора и воспроизведения mp3-клипа из списка. Он будет работать на Pi4 с 7-дюймовым сенсорным дисплеем и шляпой piAMP+. Графический интерфейс выполнен в tkinter с pygame для звука и парой контактов GPIO для увеличения/уменьшения громкости. Пользователь использует кнопки со стрелками вверх/вниз в графическом интерфейсе для выбора клипа; воспроизведение запускает выбранный клип, а остановка останавливает воспроизведение.
Полный сценарий (вверх/вниз, запуск/остановка и функциональность pygame) работает на ПК с PyCharm для Для ПК я закомментировал команды, связанные с GPIO.
При портировании на Pi с помощью Thonny для отладки графический интерфейс загружается, но кнопки GUI и GPIO не отвечают. Копия минимального сценария с одной кнопкой и без ссылок на GPIO или pygame. Я добавил операторы печати отладки непосредственно перед root.run() и внутри логики кнопок, чтобы обозначить их.
Я добавил операторы печати отладки непосредственно перед root.run(). замечено:
  • При выполнении из Thonny или командной строки графический интерфейс отображается, но кнопки не отвечают.
  • Из отладки Thonny, если я вставлю точку останова в root.run(), сценарий остановится в точке останова, и при возобновлении будут работать кнопки «Предыдущая/Следующая», «Воспроизведение/Стоп» и соответствующий код.
  • Добавление timer.sleep(5) между root.update() и root.mainloop() не имеет значения. Я также пробовал root.after(2500).
Я добавил следующие 3 элемента, чтобы объяснить свои решения по коду.
  • Мой первоначальный дизайн вызвал список для отображения песен, но не смог найти способ выделить текущий выбранный элемент из списка. Результатом является блок кода «найти песни в сетке» с label_list и текущими переменными.
  • label_list — это словарь, содержащий местоположение сетки и объект tkinter.ttk.label. При переходе к предыдущему цвета переднего плана и фона изменяются, а текущее значение (выбранной песни) обновляется.
  • При воспроизведении выбранной песни (код не показан) я получаю имя mp3-файла из песен, а не label_list. Даже если виноват label_list, я не могу активировать воспроизведение без точки останова.
Я не понимаю, почему Pi «нужна» точка останова, чтобы кнопки работали.
# Import tkinter (GUI), pygame (Audio) and csv (to parse file into a list of dict
import tkinter as tk # Display library, using grid placement
from tkinter import ttk # This includes newer methods for labels

# Variable declarations and defaults
label_list = {} # Initialize the list of song labels (in grid)
set_volume = 0.1 # Default volume, 10%
current = 0 # Index corresponding the current (highlighted) song

songs = [{'Index': 0, 'Program': "Song1", 'File': 'song1.mp3'},
{'Index': 1, 'Program': 'Song2', 'File': 'song2.mp3'},
{'Index': 2, 'Program': 'Song3', 'File': 'song3.mp3'},
{'Index': 3, 'Program': 'Song4', 'File': 'song4.mp3'},
{'Index': 4, 'Program': 'Song5', 'File': 'song5.mp3'}]

def previous():
# Decrement the current index (song), restore the old, highlight the new
global label_list # This is a list of dictionaries
global current # This is the index corresponding to the current song
# Revert the current song to default colors
print("Got to previous")
label_list[(0, current)].config(background='White', foreground='Black')
if current == 0:
current = 4 # Last song in the queue, ie wrap-around
else:
current -= 1 # Decrement by 1
# Reverse-video the new current song
label_list[(0, current)].config(background='Black', foreground='White')

def main():
# Create the root window
global songs
root = tk.Tk()
root.title("Help Me")
root.geometry('600x400')
root.config(bg='White') # Default to using white, not system background

# Create the GUI as a 6 row x 3 column Grid
for grid_row in range(6):
root.rowconfigure(grid_row, weight=1)
root.columnconfigure(0, weight=3) # The intent was to make this column wider
root.columnconfigure(1, weight=1) # This is actually a spacer between song and arrow
root.columnconfigure(2, weight=1) # These are the arrow buttons

# Locate songs on grid, column 1
for song_row in songs:
if song_row['Index'] == 0:
# Start with making this row reverse-video
song_label = ttk.Label(root, text=song_row['Program'], background='Black', foreground='White')
else:
song_label = ttk.Label(root, text=song_row['Program'], background='White', foreground='Black')
# Assign the song_label to a list which can later be manipulated
label_list[(0, song_row['Index'])] = song_label
# Assign the song_row contents to the grid at the row/column
song_label.grid(column=0, row=song_row['Index'], sticky=tk.EW, padx=5, pady=5)

# locate arrow up/down buttons on column 2 - spanning 2 rows down, u2191 is ascii up arrow
song_prev = ttk.Button(root, text='\u2191', command=previous)
song_prev.grid(column=2, row=1, columnspan=2, sticky=tk.EW, padx=5, pady=5)

# This sets the program to run continuously
root.update()
print("Got to mainloop")
root.mainloop()

if __name__ == '__main__':
main()


Подробнее здесь: https://stackoverflow.com/questions/797 ... spberry-pi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»