Динамическое обновление формы многоугольника в окне tkinter - PullRequest
0 голосов
/ 29 апреля 2020

Я пишу программу для моего Raspberry Pi4 для проекта моего Мастера, который поначалу звучал так просто, но по какой-то причине Python вызывает у меня горе.

Короче - я создал холст tkinter с многоугольником по центру на холсте. Форма этого многоугольника будет зависеть от значения счетчика.

Счет контролируется событием моргания от нейро-мозговой гарнитуры - этот счет работает (в основном).

Что я затем я хочу обновить холст, чтобы поместить новые точки для многоугольника в пакет, но ничего из того, что я пробовал, похоже, не работает. Самое близкое, что я получил, - это попытка команды .redraw (), которая вытащила бесконечное число windows до того, как я выдернул пробку.

Я не совсем новичок в программировании, учил много языков в свое время, но никогда раньше не использовал python и явно пропускаю очень простой шаг, который приведет к тому, что все выпадет.

Я попытаюсь изменить код, чтобы использовать клавиатуру, а не гарнитуру, и добавлю его ниже, если народ думает, что это поможет.

import keyboard
import time
from tkinter import *
count = 0
points = [250,250,350,250,350,350,250,350]
root = Tk()
while True:

# set window to middle of screen
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    xcoord = screen_width/2-300
    ycoord = screen_height/2 - 300
    root.geometry("%dx%d+%d+%d" % (600,600,xcoord,ycoord))
#set up canvas size and background colour
    canvas1 = Canvas(root, relief = FLAT,width = 600, height = 600, background = "blue")
#set up buttons shape and colour
    button = canvas1.create_polygon(points, fill="darkgreen", outline="yellow")
    canvas1.pack()
    if keyboard.is_pressed("f"):
        if count < 4:
            count += 1
        elif count == 4:
            count = 0
    time.sleep(0.1)

    if count == 0:
        points = [250,250,350,250,350,350,250,350]
    elif count == 1:
        points = [300,100,500,500,100,500]
    elif count == 2:
        points = [200,100,400,100,300,500]
    elif count == 3:
        points = [100,300,500,100,500,500]
    elif count == 4:
        points = [100,100,100,500,500,300]
    print(count)
    root.update()

1 Ответ

0 голосов
/ 29 апреля 2020

Вам нужно удалить старый полигон и создать новый. Также не используйте while l oop в приложении tkinter. В вашем случае вы можете привязать обратный вызов к событию <Key> и обновить полигон в обратном вызове:

import tkinter as tk

count = 0
points = [
    [250,250,350,250,350,350,250,350],
    [300,100,500,500,100,500],
    [200,100,400,100,300,500],
    [100,300,500,100,500,500],
    [100,100,100,500,500,300],
]

root = tk.Tk()

# set window to middle of screen
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
xcoord = screen_width//2 - 300
ycoord = screen_height//2 - 300
root.geometry("%dx%d+%d+%d" % (600,600,xcoord,ycoord))

#set up canvas
canvas1 = tk.Canvas(root, relief=tk.FLAT, background="blue")
canvas1.pack(fill=tk.BOTH, expand=1)

# create the polygon with tag "button"
canvas1.create_polygon(points[count], fill="darkgreen", outline="yellow", tag="button")

def on_key(event):
    global count
    if event.char == 'f':
        count = (count + 1) % len(points)
        print(count)
        canvas1.delete("button") # delete the old polygon
        canvas1.create_polygon(points[count], fill="darkgreen", outline="yellow", tag="button")

root.bind("<Key>", on_key)

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...