用实时数据创建的行在tkinter画布上缩放

问题描述 投票:0回答:1

我是Tkinter的新手,他试图弄清楚如何能够在画布上放大和缩小而又不会弄乱实时数据创建的绘制线。每隔一秒钟就会绘制一条新线,并且应该与上一条线连接,但是如果我在画布上放大,则将要绘制的下一条线不会与前一条线连接。似乎所有线条都是基于某个窗口坐标绘制的(无论我放大或缩小的大小都是一致的),而不是基于画布本身。我希望能够同时放大和缩小,并且仍然看到一条从画布的左上角到画布的右下角绘制的线。我试图提供一些代码以使其更易于理解。

import tkinter as tk
import threading
import time

root = tk.Tk()
pressed = False
flag_run = False

GRID_W = 500
GRID_H = 500

def thread_entry(name):
    print("<starting thread>")
    i = 0
    j = 0
    while flag_run:
        time.sleep(1)
        canvas.create_line(i, j, i+1, j+1, fill="red")
        i += 1
        j += 1
    print("<ending thread>")

def start():
    global flag_run
    flag_run = True
    global thread
    thread = threading.Thread(target=thread_entry, args=(1,))
    thread.start()

def stop():
    global flag_run
    if flag_run is True:
        flag_run = False
        global thread
        thread.join(timeout=0.1)

# move
def move_start(event):
    canvas.scan_mark(event.x, event.y)

def move_move(event):
    canvas.scan_dragto(event.x, event.y, gain=1)

# move
def pressed2(event):
    global pressed
    pressed = not pressed
    canvas.scan_mark(event.x, event.y)

def move_move2(event):
    if pressed:
        canvas.scan_dragto(event.x, event.y, gain=1)

# windows zoom
def zoomer(event):
    if (event.delta > 0):
        canvas.scale("all", event.x, event.y, 1.1, 1.1)
    elif (event.delta < 0):
        canvas.scale("all", event.x, event.y, 0.9, 0.9)
    canvas.configure(scrollregion = canvas.bbox("all"))

def zooming_in(event):
    canvas.scale("all", event.x, event.y, 1.1, 1.1)

def zooming_out(event):
    canvas.scale("all", event.x, event.y, 0.9, 0.9)

canvas = tk.Canvas(root, width=GRID_W, height=GRID_H, background="white")
canvas.grid(row=0, column=0, sticky="nsew")
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

for i in range(GRID_W//10 + 1):
    canvas.create_line(i*10, 0, i*10, GRID_H, fill="#c9c9c9")

for j in range(GRID_H//10 + 1):
    canvas.create_line(0, j*10, GRID_W, j*10, fill="#c9c9c9")

canvas.create_line(GRID_W // 2, 0, GRID_W // 2, GRID_H, fill="black", width=2)
canvas.create_line(0, GRID_H // 2, GRID_W, GRID_H // 2, fill="black", width=2)

canvas.bind("<ButtonPress-1>", move_start)
canvas.bind("<B1-Motion>", move_move)

canvas.bind("<ButtonPress-2>", pressed2)
canvas.bind("<Motion>", move_move2)

zoom_in = tk.Button(root, text="+")
zoom_in.grid(row=1, column=0)
zoom_in.bind("<Button-1>", zooming_in)

zoom_out = tk.Button(root, text="-")
zoom_out.grid(row=1, column=1)
zoom_out.bind("<Button-1>", zooming_out)

button = tk.Button(root, text="Start", command = start)
button.grid(row=2, column=0)

button_s = tk.Button(root, text="Stopp", command = stop)
button_s.grid(row=2, column=1)

root.mainloop()

我感谢我能获得的所有帮助和指导!

python canvas tkinter zoom android-livedata
1个回答
0
投票

尝试在按下开始按钮(zooming_in(事件))时停止flag_run,并在完成缩放后继续。请尝试记住该行的位置,并在放大和缩小时继续记录数据,以免丢失任何当前值。

© www.soinside.com 2019 - 2024. All rights reserved.