2024-05-17 00:37:07 发布
网友
我正在尝试为我用Python 3.6编写的tkinter/ttk GUI使用模拟量表。
我想显示伏特和磅/平方英寸的值。
到目前为止,我的研究使我找到了this(linuxcnc/pyvcp?),this(perl/tk)和this(tk)。
我是否有机会集成这三个方面,或者我是否应该尝试通过使用tkinter.Canvas来实现自己的规范?
tkinter.Canvas
我已经用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)
我创建了一个名为tk_tools的包,其中包含一个模拟量表。
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中找到。简短版本:
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翻译了第三个:
相同但没有箭头的褪色效果:
我创建了一个名为
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
中找到。简短版本:相关问题 更多 >
编程相关推荐