Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用实时数据创建的线在tkinter画布上缩放_Python_Canvas_Tkinter_Zooming_Android Livedata - Fatal编程技术网

Python 使用实时数据创建的线在tkinter画布上缩放

Python 使用实时数据创建的线在tkinter画布上缩放,python,canvas,tkinter,zooming,android-livedata,Python,Canvas,Tkinter,Zooming,Android Livedata,我是Tkinter的新手,我试图弄清楚如何能够在画布上进行放大和缩小,而不会弄乱由实时数据创建的绘制线。每秒都会绘制一条新线,并且应该连接到上一条线,但是如果我在画布上放大,将绘制的下一条线不会连接到上一条线。看起来所有的线条都是基于一些窗口坐标绘制的(无论我放大或缩小多少,这些坐标都是一致的),而不是基于画布本身。我希望能够尽可能地放大和缩小,并且仍然可以看到从画布的左上角到右下角绘制的线条。我试图提供一些代码,使其更容易理解 import tkinter as tk import threa

我是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()
将tkinter作为tk导入
导入线程
导入时间
root=tk.tk()
按下=错误
flag_run=False
格栅W=500
网格高度=500
def螺纹_条目(名称):
打印(“”)
i=0
j=0
运行时:
时间。睡眠(1)
画布。创建_线(i,j,i+1,j+1,fill=“红色”)
i+=1
j+=1
打印(“”)
def start():
全球旗舰运行
flag_run=True
全局线程
thread=threading.thread(target=thread\u条目,args=(1,))
thread.start()
def stop():
全球旗舰运行
如果flag_run为True:
flag_run=False
全局线程
线程连接(超时=0.1)
#移动
def move_start(事件):
canvas.scan_标记(event.x,event.y)
def move_move(事件):
canvas.scan_dragto(事件x,事件y,增益=1)
#移动
def pressed2(事件):
全球压力
按下=未按下
canvas.scan_标记(event.x,event.y)
def move_move2(事件):
如果按下:
canvas.scan_dragto(事件x,事件y,增益=1)
#窗口缩放
def缩放器(事件):
如果(event.delta>0):
画布比例(“全部”、事件x、事件y、1.1、1.1)
elif(event.delta<0):
画布比例(“全部”、事件x、事件y、0.9、0.9)
configure(scrollregion=canvas.bbox(“全部”))
def放大(事件):
画布比例(“全部”、事件x、事件y、1.1、1.1)
def缩小(事件):
画布比例(“全部”、事件x、事件y、0.9、0.9)
canvas=tk.canvas(根,宽度=网格宽度,高度=网格高度,背景=“白色”)
canvas.grid(行=0,列=0,sticky=“nsew”)
root.grid_rowconfigure(0,权重=1)
root.grid\u columnconfigure(0,权重=1)
对于范围内的i(网格W//10+1):
canvas.create_line(i*10,0,i*10,GRID_H,fill=“#c9c9c9”)
对于范围内的j(网格_H//10+1):
画布。创建线(0,j*10,网格W,j*10,fill=“#c9c9c9”)
画布。创建线(网格W//2,0,网格W//2,网格H,fill=“black”,width=2)
canvas.create_line(0,GRID_H//2,GRID_W,GRID_H//2,fill=“black”,width=2)
canvas.bind(“,move\u start)
canvas.bind(“,move\u move)
canvas.bind(“”,按2)
canvas.bind(“,move_move2)
放大=tk.按钮(根,text=“+”)
放大网格(行=1,列=0)
放大.bind(“,放大)
缩小=tk.按钮(根,text=“-”)
缩小网格(行=1,列=1)
缩小。绑定(“,缩小)
button=tk.button(root,text=“Start”,command=Start)
button.grid(行=2,列=0)
按钮(root,text=“stop”,command=stop)
按钮网格(行=2,列=1)
root.mainloop()

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

点击开始按钮(放大(事件))时,尝试停止标志运行,并在放大完成后继续。 试着记住行的位置,并在放大和缩小时记录数据,这样就不会像当前那样丢失任何值