簡體   English   中英

Python3 Tkinter模擬量規

[英]Python3 tkinter analog gauge

我正在嘗試將模擬量規用於以Python 3.6編寫的tkinter / ttk GUI。

我想顯示伏特和psi值。

到目前為止,我的研究使我想到了這個 (linuxcnc / pyvcp ?), 這個 (perl / tk)和這個 (tk)。

我是否有可能將這三者整合在一起?還是應該嘗試使用tkinter.Canvas來實現自己的量規?

我創建了一個名為tk_tools的軟件包,其中包含這些模擬儀表之一。

pip install tk_tools

資料來源: https : //github.com/slightlynybbled/tk_tools

文檔: https : //tk-tools.readthedocs.io/en/latest/docs/widgets/#rotaryscale

圖片

您正在尋找RotaryScale小部件。 使用示例可以在examples/rotary_scale.py找到。 簡短版本:

import tkinter as tk
import tk_tools

root = tk.Tk()

p = tk_tools.RotaryScale(root, max_value=100.0, unit='psi')
p.grid()

p.set_value(32.7)

root.mainloop()

我已經在python中翻譯了第三個:

屏幕截圖

import tkinter as tk
from math import pi, cos, sin


class Meter(tk.Frame):
    def __init__(self, master=None, **kw):
        tk.Frame.__init__(self, master, **kw)

        self.meter = []
        self.angle = []
        self.var = tk.IntVar(self, 0)

        self.canvas = tk.Canvas(self, width=200, height=110,
                                borderwidth=2, relief='sunken',
                                bg='white')
        self.scale = tk.Scale(self, orient='horizontal', from_=0, to=100, variable=self.var)

        for j, i in enumerate(range(0, 100, 5)):
            self.meter.append(self.canvas.create_line(100, 100, 10, 100,
                                                      fill='grey%i' % i,
                                                      width=3,
                                                      arrow='last'))
            self.angle.append(0)
            self.canvas.lower(self.meter[j])
            self.updateMeterLine(0.2, j)

        self.canvas.create_arc(10, 10, 190, 190, extent=108, start=36,
                               style='arc', outline='red')

        self.canvas.pack(fill='both')
        self.scale.pack()

        self.var.trace_add('write', self.updateMeter)  # if this line raises an error, change it to the old way of adding a trace: self.var.trace('w', self.updateMeter)
        self.updateMeterTimer()

    def updateMeterLine(self, a, l=0):
        """Draw a meter line (and recurse for lighter ones...)"""
        oldangle = self.angle[l]
        self.angle[l] = a
        x = 100 - 90 * cos(a * pi)
        y = 100 - 90 * sin(a * pi)
        self.canvas.coords(self.meter[l], 100, 100, x, y)
        l += 1
        if l < len(self.meter):
            self.updateMeterLine(oldangle, l)

    def updateMeter(self, name1, name2, op):
        """Convert variable to angle on trace"""
        mini = self.scale.cget('from')
        maxi = self.scale.cget('to')
        pos = (self.var.get() - mini) / (maxi - mini)
        self.updateMeterLine(pos * 0.6 + 0.2)

    def updateMeterTimer(self):
        """Fade over time"""
        self.var.set(self.var.get())
        self.after(20, self.updateMeterTimer)


if __name__ == '__main__':
    root = tk.Tk()
    meter = Meter(root)
    meter.pack()
    root.mainloop()

相同,但沒有箭頭的褪色效果:

class Meter(tk.Frame):
    def __init__(self, master=None, **kw):
        tk.Frame.__init__(self, master, **kw)

        self.var = tk.IntVar(self, 0)

        self.canvas = tk.Canvas(self, width=200, height=110,
                                borderwidth=2, relief='sunken',
                                bg='white')
        self.scale = tk.Scale(self, orient='horizontal', from_=0, to=100, variable=self.var)

        self.meter = self.canvas.create_line(100, 100, 10, 100,
                                             fill='black',
                                             width=3,
                                             arrow='last')
        self.angle = 0
        self.updateMeterLine(0.2)

        self.canvas.create_arc(10, 10, 190, 190, extent=108, start=36,
                               style='arc', outline='red')

        self.canvas.pack(fill='both')
        self.scale.pack()

        self.var.trace_add('write', self.updateMeter)  # if this line raises an error, change it to the old way of adding a trace: self.var.trace('w', self.updateMeter)

    def updateMeterLine(self, a):
        """Draw a meter line"""
        self.angle = a
        x = 100 - 90 * cos(a * pi)
        y = 100 - 90 * sin(a * pi)
        self.canvas.coords(self.meter, 100, 100, x, y)

    def updateMeter(self, name1, name2, op):
        """Convert variable to angle on trace"""
        mini = self.scale.cget('from')
        maxi = self.scale.cget('to')
        pos = (self.var.get() - mini) / (maxi - mini)
        self.updateMeterLine(pos * 0.6 + 0.2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM