Assalamualaikum warohmatulloh sahabat semua … Pada malam hari ini kita akan sharing tentang project whitecyber team yang berhubungan dengan GRAPHICAL USER INTERFACE. Kali ini yang kita bahas tentang pembuatan Gauge.
Alat Ukur (Gauge) Dalam Metrologi – Pengertian, Prinsip dan Jenisnya
Pada project ini kita akan membahas tentang alat ukur yang digunakan dalam metrologi, karena Metrologi adalah bagian penting dari teknik mesin yang berhubungan dengan pengukuran benda kerja. Metrologi bergantung pada dua faktor penting, yaitu waktu dan kuantitas, yang harus diukur oleh seorang engineer untuk memastikan ketepatan suatu benda kerja.
Sebelum kita membahas lebih jauh tentang alat ukur, mari belajar 4 prinsip dalam pengukuran terlebih dahulu. Memahami Empat Prinsip Dalam Pengukuran
Terdapat 4 prinsip umum dalam melakukan pengukuran dengan presisi tinggi yang menyangkut hal-hal seperti presisi dimensi, presisi sudut, dan presisi bentuk. Prinsip-prinsip tersebut adalah sebagai berikut.
1. Mengetahui suhu benda kerja
Saat mengukur dimensi suatu benda kerja, Anda perlu mengetahui suhu dari benda tersebut karena berkaitan dengan koefisien ekspansi termal linier (CLTE) dan akan mempengaruhi panjang benda. Koefisien ekspansi linier terhadap tingkat perubahan panjang pada beberapa bahan gauge ditampilkan pada Tabel 1.
Tabel 1. Koefisien ekspansi linier pada beberapa bahan gauge
Berdasarkan tabel di atas, diketahui bahwa setiap bahan pada suhu 20°C memiliki nilai koefisien ekspansi linier yang berbeda. Dengan demikian, penting untuk menjaga objek yang diukur pada suhu konstan (yaitu suhu referensi). Meskipun alat ukur umumnya disimpan di ruangan bersuhu konstan (20°C), benda kerja yang diukur biasanya memiliki suhu yang berbeda. Suhu suatu benda kerja harus dipantau setiap saat dan jika berbeda dari suhu referensi, pengukuran harus dikoreksi dengan perhitungan.
Panas ditransmisikan antara objek dengan konduksi dan radiasi (yaitu transfer panas antara benda yang jauh oleh gelombang elektromagnetik). Suhu selama proses pengukuran juga dapat dipengaruhi oleh radiasi pencahayaan, sinar matahari, tubuh manusia, dan peralatan listrik. Pencahayaan ruangan dapat dengan mudah menaikkan suhu benda kerja sebesar 0,1°C sementara pemanasan dari radiasi dapat menyebabkan kenaikan beberapa derajat.
2. Memperhatikan metode pengukuran kontak atau non-kontak
Metode pengukuran non-kontak lebih disukai daripada metode kontak. Bahkan tenaga sekecil apapun akan menyebabkan objek berubah bentuk, dan deformasi yang akan menjadi kesalahan dalam pengukuran, kecuali jika dikoreksi. Prinsip ini berlaku dalam hal evaluasi seperti presisi dimensi, presisi sudut, presisi bentuk dan kekasaran permukaan. Pengukuran dapat diklasifikasikan menjadi dua metode umum: kontak dan non-kontak. Pengukuran non-kontak adalah metode yang ideal untuk dilakukan karena tidak ada kesalahan yang disebabkan oleh deformasi. Namun, Anda perlu berhati-hati untuk mencegah cahaya atau radiasi instrumen menghasilkan panas terhadap objek yang diukur. Sedangkan metode kontak akan menyebabkan deformasi, tidak peduli seberapa kecil tenaga yang diterapkan.
3. Memahami presisi instrumen
Ketepatan alat ukur harus 5-10 kali lebih tinggi dari presisi yang diharapkan dari objek yang diukur. Jika kita menggunakan instrumen dengan presisi m untuk mengukur sebuah produk dengan toleransi mesin w, maka presisi yang terukur didapat dari:
2 = w2 + m2
dimana:
w = 1;
m = 15(misalnya: presisi instrumen adalah 5 kali lebih tinggi dari toleransinya);
= 1.020, sehingga presisi instrumen mempengaruhi pengukuran sebesar 2 persen.
jika kita membiarkan = 110, pengaruh ini dipertahankan pada 0,5%. Jadi, untuk meminimalkan efek presisi instrumen terhadap pengukuran, presisi instrumen harus 5-10 kali lebih tinggi dari presisi yang diharapkan dari objek yang diukur.
4. Memahami karakteristik instrumen
Semua mesin, termasuk alat ukur, memiliki berbagai karakteristik. Misalnya, beberapa instrumen memerlukan pendekatan searah saat memutar tombol untuk menghindari efek ‘backlash’, sementara di instrumen lain pengukuran harus diselesaikan dalam waktu singkat karena adanya drift. Seseorang dapat secara tidak sadar melakukan kesalahan selama pengukuran jika tidak menyadari karakteristik instrumen tersebut. Karakteristik mesin dianggap sebagai bentuk bias, yang harus diminimalisir sebelum melakukan pengukuran. Tidak hanya dalam pengukuran tetapi juga dalam manufaktur, Anda harus mengetahui karakteristik dari mesin.
Alat Ukur (Gauge) Dalam Metrologi
Setiap benda kerja memiliki beberapa tingkat kesalahan di dalamnya yang dapat berdampak negatif pada efisiensi mekanik dari sebuah komponen mesin. Oleh karena itu, untuk mengurangi atau mengatasi kesalahan tersebut, dibuatlah berbagai alat ukur (gauge) oleh para engineer. Gauge adalah alat yang digunakan oleh para engineer untuk memperbaiki kesalahan dalam hal pengukuran linier. Pengukuran linier berkaitan dengan pengukuran panjang, tinggi, diameter, dan sebagainya. Untuk memahami lebih dalam tentang definisi gauge dan jenis-jenisnya, simak pembahasan berikut ini.
Apa itu Alat Ukur (Gauge)?
Gauge atau alat ukur adalah alat yang digunakan oleh para engineer untuk memeriksa dan mengukur batas toleransi suatu komponen. Gauge umumnya digunakan oleh para engineer untuk memisahkan dimensi benda kerja yang sesuai. Seorang operator dapat menggunakan gauge tanpa harus memiliki pengetahuan yang luas dalam mengoperasikan komponen mekanis tersebut. Penggunaan alat ukur juga hanya membutuhkan waktu yang singkat dibandingkan alat pengukur lainnya.
Jenis-Jenis Alat Ukur Dalam Metrologi
Plain gauge (alat ukur biasa) diklasifikasikan menjadi 4 jenis yang berbeda, yaitu:
A. Jenis Alat Ukur (Gauge) Berdasarkan Tipe dan Prinsip Pembuatan
- Standard Gauge
Standar gauge dapat didefinisikan sebagai alat ukur yang memeriksa salinan dari mating part sebuah benda kerja. Alat ukur ini hanya berupa konsep ideal, namun tidak dapat digunakan karena selalu ada toleransi yang diberikan pada suatu benda kerja dan toleransi ini tidak memperhitungkan standar gauge. - Limit Gauge
Limit gauge didefinisikan sebagai gauge yang digunakan untuk mengukur komponen dengan dua batas, yakni batas atas dan batas bawah. Terdapat 2 bagian gauge untuk mengukur dimensi material yaitu Go-Gauge dan Not-Go-Gauge. Bagian dari komponen harus melewati Go-Gauge dan tidak boleh melewati bagian Not-Go-Gauge. - Indicating Gauge
Indicating gauge (pengukur indikasi) didefinisikan sebagai alat pengukur benda kerja yang menampilkan pengukuran pada indikator atau tampilan layar. Alat ini merupakan alat yang lebih kompleks dari pengukur lainnya. Contoh indicating gauge adalah dial gauge. - Combination Gauge
Combination gauge (pengukur kombinasi) didefinisikan sebagai pengukur yang dapat mengambil lebih dari satu dimensi bagian material secara berurutan.
Hal ini sangat berguna karena dalam satu waktu dapat melakukan lebih dari satu pengukuran sehingga memakan waktu yang lebih singkat dan mendapatkan hasil yang lebih efisien.
B. Jenis Alat Ukur Berdasarkan Tujuannya
- Workshop Gauge
Workshop gauge didefinisikan sebagai alat yang digunakan untuk mengukur bagian-bagian material pada saat produksi di bengkel / pabrik, sehingga dinamakan workshop gauge. Workshop gauge dirancang dengan toleransi berada di posisi tengah, sehingga workshop gauge sangat berguna di pabrik atau bengkel daripada yang lain. - Inspection Gauge
Inspection gauge didefinisikan sebagai alat yang digunakan oleh inspektur di pabrik setelah menyelesaikan pembuatan produk sesuai standar yang dapat diterima. Karena penerimaan atau penolakan produk tergantung pada pengukuran gauge sehingga toleransi dari inspection gauge agak lebih dari workshop gauge. Jika toleransi bagian material tinggi, maka dapat diterima. Jika tidak, material harus ditolak. - Master Gauge (Reference Gauge)
Master gauge (pengukur utama) didefinisikan sebagai alat untuk memeriksa gauge lainnya. Master gauge sangat penting karena efisiensi alat pengukur lainnya sangat bergantung pada master gauge. Jika master gauge tidak dapat memeriksa gauge atau instrumen lain dengan benar, maka gauge dan instrumen tersebut tidak dapat memberikan hasil yang akurat.
C. Jenis Alat Ukur Berdasarkan Fungsinya
Dimension Measuring Gauge
Dimension measuring gauge didefinisikan sebagai alat ukur yang mengukur parameter yang sangat kecil dari material dengan akurasi yang sangat tinggi. Dimensi yang diukur dengan alat ukur ini adalah kedalaman, tinggi, diameter dan sebagainya dengan sangat spesifik dan akurat.
Pengukur dimensi ini diklasifikasikan dalam 3 jenis, yaitu:
1. Inside Dimension Measuring Gauge
Inside dimension measuring gauge digunakan untuk memeriksa dan mengukur diameter, lebar dan tinggi dari bagian dalam material. Berdasarkan fungsinya sebagai alat inspeksi (inspection tools), inside dimension gauge diklasifikasikan menjadi 2 jenis, yaitu:
- Plug Gauge
Plug Gauge adalah alat inspeksi yang menghubungkan bagian berulir internal dengan prinsip “go” dan “no-go” berbentuk silinder. Alat ini digunakan untuk mengukur diameter dalam suatu benda kerja dengan akurat. - Pin Gauge
Pin gauge umumnya memiliki prinsip kerja yang sama seperti plug gauge, yaitu digunakan untuk mengukur dan memeriksa diameter dalam yang lebih dari 75 mm, serta juga dapat digunakan sebagai test bar untuk pengukuran deviasi geometris.
Berdasarkan fungsinya sebagai alat ukur (measuring tools), inside dimension gauge diklasifikasikan menjadi beberapa jenis, yaitu:
- Bore Gauge
Bore gauge adalah alat untuk mengukur garis tengah bagian dalam dari sebuah benda kerja, seperti : cylinder, lubang dudukan poros dan lain-lain. - Measuring Table
Measuring table terdiri dari berbagai ukuran, tata letak, dan rentang pengukuran. Alat ini sering digunakan dekat dengan mesin produksi, misalnya untuk pengukuran sampel.
2. Outside Dimension Measuring Gauge
Outside dimension measuring gauge digunakan untuk memeriksa dan mengukur diameter, lebar dan tinggi dari bagian luar material, diklasifikasikan dalam beberapa jenis, yaitu:
Berdasarkan fungsinya sebagai alat inspeksi (inspection tools), outside dimension gauge diklasifikasikan menjadi:
- Ring Gauge
Ring gauge adalah alat inspeksi diameter luar dengan prinsip “go” dan “no-go”. No-Go Ring Gauges digunakan untuk mengikat bagian berulir seperti baut. Ring gauge harus dikalibrasi sebelum digunakan dengan thread gauge dan banyaknya putaran dibatasi maksimal 1,5-2.
Berdasarkan fungsinya sebagai alat ukur (measuring tools), outside dimension gauge diklasifikasikan menjadi:
- Snap Gauge
Snap gauge adalah alat ukur berbentuk U yang digunakan untuk memverifikasi dengan cepat apakah dimensi luar cocok dengan dimensi yang telah ditetapkan atau berada dalam toleransi yang telah ditentukan. - External Diameter Gauge
External diameter gauge (pengukur diameter luar) adalah jenis gauge yang berpusat pada diri sendiri yang mengukur diameter luar dengan rentang pengukuran: 5–25 mm.
3. Both Sides Dimension Measuring Gauge
Both sides dimension measuring gauge digunakan untuk mengukur bagian luar dan bagian inti atau dalam, baik diameter, lebar, tinggi, dan sebagainya. Both sides dimension measuring gauge diklasifikasikan dalam beberapa jenis, yaitu:
- Caliper Gauge (Pengukur Kaliper)
Caliper gauge biasanya terdiri dari dua jenis: internal dan eksternal. Kaliper digunakan untuk mengukur ukuran/jarak internal dan eksternal (misalnya: diameter) dari suatu objek. Pengukuran menggunakan alat ukur ini dilakukan pada permukaan objek, kemudian bukaan mulut caliper didekatkan dengan skala penggaris untuk mengetahui panjang atau diameter objek. Contoh caliper gauge adalah kaliper vernier, kaliper dial, kaliper digital dan kaliper mikrometer. - Air Gauge
Air gauge adalah alat ukur non-kontak yang bekerja dengan menghambat aliran udara pada tingkat yang sebanding dengan perbedaan ukuran dimensi yang diukur. Air gauge umumnya digunakan untuk benda kerja dengan kondisi toleransi yang ketat, yang memiliki volume tinggi dan pada lingkungan yang kotor.
Geometry Measuring Gauge
Pengukur geometris didefinisikan sebagai alat ukur yang dapat mengukur konsentrisitas, lancip, dan profilnya. Pengukur pengukuran geometris umumnya digunakan untuk mengukur kekasaran atau ketidakrataan permukaan.
Geometry gauge dibagi menjadi 3 jenis, yaitu:
- Pengukur Konsentrisitas (Gauge for Concentricity)
Pengukur konsentrisitas digunakan untuk mengukur run out dengan memutar silinder atau putaran yang dimuat pada dua pasang bantalan dalam blok aluminium anodized. Alat pengukur ini umumnya digunakan untuk mengukur lingkaran pesawat. - Pengukur Lancip (Gauge for Taper)
Pengukur lancip pada dasarnya digunakan untuk mengukur lancip internal. Pengukur ini terlihat seperti pengukur internal dalam bentuk frustum kerucut. - Pengukur Profil (Gauge for Profile)
Pengukur profil atau pengukur kontur adalah alat yang digunakan untuk menggambar profil atau menyalinnya ke permukaan lain.
D. Jenis Alat Ukur Berdasarkan pada Desain
- Single Limit and Double Limit (batas tunggal dan batas ganda)
Pengukur batas tunggal memiliki jepitan yang tetap yang membuat pengukur terbatas, tetapi dalam kasus pengukur batas ganda memiliki jepitan yang bergerak yang dapat digandakan dengan bantuan jepitan yang dapat disesuaikan. - Single-ended and Double-ended (berakhir tunggal dan berakhir ganda)
Pengukur ujung tunggal memiliki ujung tunggal yang dapat berupa ‘Go end’ atau ‘No-go end’. Sedangkan pada double-end gauge memiliki dua ujung, salah satu ujungnya adalah ‘Go end’ dan ujung yang lain adalah ‘No-go end’. - Fixed and Fastened Gauges (Tetap dan Diikat)
Dalam pengukur ujung tetap, kedua jepitan dipasang pada saat yang sama, tetapi dalam pengukur ujung yang diikat hanya satu jepitan yang dapat bergerak atau disesuaikan. Jenis ini sebagian besar merupakan jenis snap gauge.
Bahan yang Digunakan untuk Membuat Alat Ukur
Bahan yang digunakan untuk membuat alat ukur harus memenuhi persyaratan berikut:
- Bahan yang digunakan harus keras dan tahan aus untuk masa pakai yang lama.
- Bahan harus mampu menjaga stabilitas dimensi dan bentuk.
- Harus tahan korosi.
- Harus mudah dikerjakan, untuk mendapatkan tingkat akurasi dan permukaan akhir yang dibutuhkan.
- Harus memiliki koefisien ekspansi yang rendah, untuk menghindari efek suhu.
Bahan-bahan yang umum digunakan untuk membuat alat ukur adalah sebagai berikut:
- Baja karbon tinggi (high carbon steel)
Bahan yang paling cocok dan murah.
Dapat diperlakukan pada suhu panas untuk memberikan stabilitas dan kekerasan tinggi.
Bahan dapat dengan mudah dikerjakan dengan tingkat akurasi yang tinggi. - Baja Ringan (mild steel)
Bahan yang paling cocok untuk gauge yang lebih besar.
Dapat diperlakukan pada suhu panas yang sesuai dengan karburasi dan kedalaman yang dibutuhkan. - Lapisan krom (chromium-plated)
Gauge berlapis krom sangat populer dan banyak digunakan untuk pengukuran.
Lapisan krom membuat permukaan gauge sangat keras dan tahan terhadap korosi dan abrasi. - Kaca
Gauge dengan bahan kaca tidak terlalu populer meskipun memiliki sifat tahan aus dan tahan korosi yang baik.
Kekurangannya adalah mudah pecah jika terjatuh.
Kaca tidak terpengaruh oleh perubahan suhu dan memiliki koefisien ekspansi termal yang sangat rendah. - Invar
Mengandung 36% nikel dan memiliki koefisien ekspansi yang rendah, namun tidak cocok untuk digunakan dalam waktu yang lama. - Elinvar
Elinvar memiliki 42% nikel, lebih stabil dari Invar, dan juga memiliki koefisien ekspansi yang rendah.
Saya ingin menyertakan modul widget dengan ttkbootstrap yang menyertakan widget khusus yang berguna di UI modern.
Pengukur radial ini adalah kandidat potensial (contohnya ada di vanilla ttk). Saya dapat membuatnya dengan warna tema, dan saya telah mengaturnya agar dapat disesuaikan di konstruktor. Meskipun demikian, saya mungkin ingin penyesuaian pada kelas gaya daripada menggunakan konstruktor agar konsisten dengan api ttk, setidaknya sebanyak mungkin.
.
import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk, ImageDraw class Gauge(ttk.Label): def __init__(self, parent, **kwargs): self.arc = None self.im = Image.new('RGBA', (1000, 1000)) self.min_value = kwargs.get('minvalue') or 0 self.max_value = kwargs.get('maxvalue') or 100 self.size = kwargs.get('size') or 200 self.font = kwargs.get('font') or 'helvetica 12 bold' self.background = kwargs.get('background') self.foreground = kwargs.get('foreground') or '#777' self.troughcolor = kwargs.get('troughcolor') or '#e0e0e0' self.indicatorcolor = kwargs.get('indicatorcolor') or '#01bdae' self.arcvariable = tk.IntVar(value='text') self.arcvariable.trace_add('write', self.update_arcvariable) self.textvariable = tk.StringVar() self.setup() super().__init__(parent, image=self.arc, compound='center', style='Gauge.TLabel', textvariable=self.textvariable, **kwargs) def setup(self): """Setup routine""" style = ttk.Style() style.configure('Gauge.TLabel', font=self.font, foreground=self.foreground) if self.background: style.configure('Gauge.TLabel', background=self.background) draw = ImageDraw.Draw(self.im) draw.arc((0, 0, 990, 990), 0, 360, self.troughcolor, 100) self.arc = ImageTk.PhotoImage(self.im.resize((self.size, self.size), Image.LANCZOS)) def update_arcvariable(self, *args): """Redraw the arc image based on variable settings""" angle = int(float(self.arcvariable.get())) + 90 self.im = Image.new('RGBA', (1000, 1000)) draw = ImageDraw.Draw(self.im) draw.arc((0, 0, 990, 990), 0, 360, self.troughcolor, 100) draw.arc((0, 0, 990, 990), 90, angle, self.indicatorcolor, 100) self.arc = ImageTk.PhotoImage(self.im.resize((self.size, self.size), Image.LANCZOS)) self.configure(image=self.arc) if __name__ == '__main__': root = tk.Tk() style = ttk.Style() gauge = Gauge(root, padding=20) gauge.pack() ttk.Scale(root, from_=0, to=360, variable=gauge.arcvariable).pack(fill='x', padx=10, pady=10) # update the textvariable with the degrees information when the arcvariable changes gauge.arcvariable.trace_add('write', lambda *args, g=gauge: g.textvariable.set(f'{g.arcvariable.get()} deg')) root.mainloop()
.
.
Sekarang kita ke tingkat yang lebih advance !
kita install terlebih dahulu paket berikut :
- curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
- pip install tk
- python -m pip install ttkbootstrap==0.5.3
.
Setelah itu baru kita kerjakan untuk menghasilkan matrik berikut :
.
Source Code
.
""" A Meter widget that presents data and progress in a radial style gauge. Author: Israel Dryer, israel.dryer@gmail.com Modified: 2021-05-22 Inspired by: https://www.jqueryscript.net/chart-graph/Customizable-Animated-jQuery-HTML5-Gauge-Meter-Plugin.html """ import tkinter as tk from PIL import Image, ImageTk, ImageDraw from tkinter import StringVar, IntVar from tkinter import ttk from tkinter.ttk import Frame from ttkbootstrap import Style, Colors class Meter(Frame): """A radial meter that can be used to show progress of long running operations or the amount of work completed This widget is very flexible and can be customized to show a wide variety of styles. There are two primary meter types which can be set with the ``metertype`` parameter: 'full', and 'semi', which show the arc of the meter in a full or semi circle. You can also customize the arc of the circe with the ``arcrange`` and ``arcoffset`` parameters. The progressbar indicator can be displayed as a solid color or with stripes with the ``stripethickness`` parameter. By default, the ``stripethickness`` is 0, which results in a solid progressbar. A higher ``stripethickness`` results in larger widgets around the meter. Various text and label options exist. You can prepend or append text to the centeral text displayed on the widget with the ``textappend`` and ``textprepend`` parameters. You can also change the style and font size of those elements. Variable are generated by default for this widget and they can be linked to other widgets by referencing them via the widget: ``Meter.amountusedvariable``, ``Meter.amounttotalvariable``, etc... Properties are also available for these variables so that they can be modified and access without calling the getter and setter directly. For example: ``Meter.amountused`` or ``Meter.amountused = 55`` will get or set the amount used on the widget without having to call the ``get`` or ``set`` methods of the tkinter variable. """ def __init__(self, master=None, arcrange=None, arcoffset=None, amounttotal=100, amountused=0, labelfont='Helvetica 10 bold', labelstyle='secondary.TLabel', labeltext=None, metersize=200, meterstyle='primary.TLabel', metertype='full', meterthickness=10, showvalue=True, stripethickness=0, textappend=None, textfont='Helvetica 25 bold', textprepend=None, wedgesize=0, **kw): """ Args: master (Widget): parent widget Keyword Args: arcoffset (int): the amount to offset the arc's starting position in degrees; 0 is at 3 o'clock. arcrange (int): the range of the arc in degrees from starting to ending position. amounttotal (int): the maximum value of the meter. amountused (int): the current value of the meter; display on the meter if ``showvalue`` is ``True``. labelfont(int): the font size of the supplemental label. labelstyle (str): the ttk style used to render the supplemental label. labeltext (str): supplemental text that appears `below` the central text of the meter. metersize (int): the size of the meter; represented by one side length of a square. meterstyle (str): the ttk style used to render the meter and central text. metertype (str): `full`, or `semi`; displays a full-circle or semi-circle. meterthickness (int): the thickness of the meter's progress bar. showvalue (bool): shows the meter value in the central text of the meter; default = True. stripethickness (int): shows the meter's progressbar in solid or striped form. If the value is greater than 0, the meter's progressbar changes from a solid to a stripe, where the value is the thickness of the stripes. textappend (str): a short string appended to the central meter text. textfont (int): the font size of the central text shown on the meter. textprepend (str): a short string prepended to the central meter text. wedgesize (int): if greater than zero, the width of the wedge on either side of the current meter value. """ super().__init__(master=master, **kw) self.box = ttk.Frame(self, width=metersize, height=metersize) # default arcoffset and arcrange for 'semi' and 'full' meter modes. if metertype == 'semi': self.arcoffset = -225 if not arcoffset else arcoffset self.arcrange = 270 if not arcrange else arcrange else: # aka 'full' self.arcoffset = -90 if not arcoffset else arcoffset self.arcrange = 360 if not arcrange else arcrange # widget variables self.amountusedvariable = IntVar(value=amountused) self.amounttotalvariable = IntVar(value=amounttotal) self.labelvariable = StringVar(value=labeltext) self.amountusedvariable.trace_add('write', self.draw_meter) # misc widget settings self.towardsmaximum = True self.metersize = metersize self.meterthickness = meterthickness self.meterforeground = self.lookup(meterstyle, 'foreground') self.meterbackground = Colors.update_hsv(self.lookup(meterstyle, 'background'), vd=-0.1) self.stripethickness = stripethickness self.showvalue = showvalue self.wedgesize = wedgesize # meter image self.meter = ttk.Label(self.box) self.draw_base_image() self.draw_meter() # text & Label widgets self.textcontainer = ttk.Frame(self.box) self.textprepend = ttk.Label(self.textcontainer, text=textprepend, font=labelfont, style=labelstyle) self.textprepend.configure(anchor='s', padding=(0, 5)) self.text = ttk.Label(self.textcontainer, textvariable=self.amountusedvariable, style=meterstyle, font=textfont) self.textappend = ttk.Label(self.textcontainer, text=textappend, font=labelfont, style=labelstyle) self.textappend.configure(anchor='s', padding=(0, 5)) self.label = ttk.Label(self.box, text=labeltext, style=labelstyle, font=labelfont) # geometry manager self.meter.place(x=0, y=0) self.box.pack() if labeltext: self.textcontainer.place(relx=0.5, rely=0.45, anchor='center') else: self.textcontainer.place(relx=0.5, rely=0.5, anchor='center') if textprepend: self.textprepend.pack(side='left', fill='y') if showvalue: self.text.pack(side='left', fill='y') if textappend: self.textappend.pack(side='left', fill='y') self.label.place(relx=0.5, rely=0.6, anchor='center') @property def amountused(self): return self.amountusedvariable.get() @amountused.setter def amountused(self, value): self.amountusedvariable.set(value) @property def amounttotal(self): return self.amounttotalvariable.get() @amounttotal.setter def amounttotal(self, value): self.amounttotalvariable.set(value) def draw_base_image(self): """Draw the base image to be used for subsequent updates""" self.base_image = Image.new('RGBA', (self.metersize * 5, self.metersize * 5)) draw = ImageDraw.Draw(self.base_image) # striped meter if self.stripethickness > 0: for x in range(self.arcoffset, self.arcrange + self.arcoffset, 2 if self.stripethickness == 1 else self.stripethickness): draw.arc((0, 0, self.metersize * 5 - 20, self.metersize * 5 - 20), x, x + self.stripethickness - 1, self.meterbackground, self.meterthickness * 5) # solid meter else: draw.arc((0, 0, self.metersize * 5 - 20, self.metersize * 5 - 20), self.arcoffset, self.arcrange + self.arcoffset, self.meterbackground, self.meterthickness * 5) def draw_meter(self, *args): """Draw a meter Args: *args: if triggered by a trace, will be `variable`, `index`, `mode`. """ im = self.base_image.copy() draw = ImageDraw.Draw(im) if self.stripethickness > 0: self.draw_striped_meter(draw) else: self.draw_solid_meter(draw) self.meterimage = ImageTk.PhotoImage(im.resize((self.metersize, self.metersize), Image.CUBIC)) self.meter.configure(image=self.meterimage) def draw_solid_meter(self, draw): """Draw a solid meter Args: draw (ImageDraw): an object used to draw an arc on the meter """ if self.wedgesize > 0: meter_value = self.meter_value() draw.arc((0, 0, self.metersize * 5 - 20, self.metersize * 5 - 20), meter_value - self.wedgesize, meter_value + self.wedgesize, self.meterforeground, self.meterthickness * 5) else: draw.arc((0, 0, self.metersize * 5 - 20, self.metersize * 5 - 20), self.arcoffset, self.meter_value(), self.meterforeground, self.meterthickness * 5) def draw_striped_meter(self, draw): """Draw a striped meter Args: draw (ImageDraw): an object used to draw an arc on the meter """ if self.wedgesize > 0: meter_value = self.meter_value() draw.arc((0, 0, self.metersize * 5 - 20, self.metersize * 5 - 20), meter_value - self.wedgesize, meter_value + self.wedgesize, self.meterforeground, self.meterthickness * 5) else: for x in range(self.arcoffset, self.meter_value() - 1, self.stripethickness): draw.arc((0, 0, self.metersize * 5 - 20, self.metersize * 5 - 20), x, x + self.stripethickness - 1, self.meterforeground, self.meterthickness * 5) def lookup(self, style, option): """Wrapper around the tcl style lookup command Args: style (str): the name of the style used for rendering the widget. option (str): the option to lookup from the style option database. Returns: any: the value of the option looked up. """ return self.tk.call("ttk::style", "lookup", style, '-%s' % option, None, None) def meter_value(self): """Calculate the meter value Returns: int: the value to be used to draw the arc length of the progress meter """ return int((self.amountused / self.amounttotal) * self.arcrange + self.arcoffset) def step(self, delta=1): """Increase the indicator value by ``delta``. The default increment is 1. The indicator will reverse direction and count down once it reaches the maximum value. Keyword Args: delta (int): the amount to change the indicator. """ if self.amountused >= self.amounttotal: self.towardsmaximum = True self.amountused = self.amountused - delta elif self.amountused <= 0: self.towardsmaximum = False self.amountused = self.amountused + delta elif self.towardsmaximum: self.amountused = self.amountused - delta else: self.amountused = self.amountused + delta if __name__ == '__main__': def test(meter): meter.step() meter.after(10, test, meter) style = Style('litera') root = style.master Meter(metersize=180, padding=20, amountused=25, metertype='semi', labeltext='miles per hour').grid(row=0, column=0) Meter(metersize=180, padding=20, amountused=1800, amounttotal=2600, labeltext='storage used', textappend='gb', meterstyle='info.TLabel', stripethickness=10).grid(row=0, column=1) Meter(metersize=180, padding=20, stripethickness=2, amountused=40, labeltext='project capacity', textappend='%', meterstyle='success.TLabel').grid(row=1, column=0) Meter(metersize=180, padding=10, amounttotal=280, arcrange=180, arcoffset=-180, amountused=75, textappend='°', labeltext='heat temperature', meterstyle='danger.TLabel').grid(row=1, column=1) style.master.mainloop()
.