Python 3.6で書かれたtkinter/ttk GUIにアナログゲージを使用しようとしています。Python3 tkinterアナログゲージ
ボルトとpsi値の表示に必要です。
私の研究は、これまで(TK)this、this(linuxcnc/pyvcp?)に私を導いた(perlの/ TK)とthis。
これらの3つを統合する可能性はありますか、tkinter.Canvas
を使用して自分のゲージを実装しようとする必要はありますか?
Python 3.6で書かれたtkinter/ttk GUIにアナログゲージを使用しようとしています。Python3 tkinterアナログゲージ
ボルトとpsi値の表示に必要です。
私の研究は、これまで(TK)this、this(linuxcnc/pyvcp?)に私を導いた(perlの/ TK)とthis。
これらの3つを統合する可能性はありますか、tkinter.Canvas
を使用して自分のゲージを実装しようとする必要はありますか?
tk_tools
というパッケージに、これらのアナログゲージの1つが含まれています。
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
にあります。ショートバージョン:私はPythonで第3回ものを翻訳した
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()
:
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()
は素晴らしい見えます!背景はちょうどpngなので、私はこれを変えることができます。私は間違いなくこれを試してみます。 –
良い取引。私は私の周りの人(labviewのプログラミング)が私が持っていないいくつかのユーザーインターフェイス要素を見つけました、それはそこにいくつかの要素の部分的なルートです。あなたがより良い背景の写真を思いついたら、それを加えてプルリクエストをしてください!ユーザーが必要とする背景を指定できないようにする必要はありません。 – slightlynybbled