2017-10-17 6 views
0

J'essaie d'utiliser une jauge analogique pour mon interface graphique tkinter/ttk écrite en Python 3.6. Je l'ai besoin pour l'affichage des valeurs de volt et de psi.Python3 tkinter jauge analogique

Mes recherches jusqu'à présent m'a amené à this (linuxcnc/pyvcp?), this (perl/tk) et this (tk).

Y at-il une chance que je pourrais intégrer sur ces trois ou devrais-je essayer d'implémenter ma propre jauge en utilisant tkinter.Canvas?

Répondre

2

J'ai créé un package appelé tk_tools qui possède l'un de ces indicateurs analogiques.

pip install tk_tools

Source: https://github.com/slightlynybbled/tk_tools

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

image

Vous recherchez le widget RotaryScale. Un exemple d'utilisation peut être trouvé dans examples/rotary_scale.py. La version courte:

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() 
+0

Regarde grand! Et l'arrière-plan est juste un png, donc je peux changer cela. Je vais certainement essayer ça. –

+0

Bonne affaire. J'ai trouvé plusieurs éléments d'interface utilisateur que les gars autour de moi (programmation dans labview) ont que je n'ai pas, donc c'est la racine partielle de certains des éléments là-bas. Si vous venez avec une meilleure photo d'arrière-plan, ajoutez-la et faites une demande de tirage! Il n'y a aucune raison que l'utilisateur ne puisse pas spécifier l'arrière-plan souhaité. – slightlynybbled

2

Je traduis la 3ème en python:

screenshot

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()