[PYTHON] Testen Sie den Tkinter-bezogenen Rückruf

Lassen Sie Hex SpinBox und Bin Editor miteinander interagieren

Was willst du tun

hextobin.png Wenn Sie dies ändern, ändert sich dies. Wenn Sie dies ändern, ändert sich dies. Ist es etwas mühsam, die GUIs miteinander zu betreiben?

Was ich getan habe

Durch Registrieren von Rückruffunktionen in den Handlern des jeweils anderen Ich habe versucht, die Veränderungen des anderen zu kommunizieren. Es mag eine einfachere Implementierung geben, aber zuerst konnten wir interagieren.

hextobin2.png

Rückruf def (i): # Rückruffunktion generieren Wert in jedem Feld einstellen hx.set(i) be.set(i)

hx.setCallback (Rückruf) # Rückruf, wenn sich die Handlerregistrierung in HexSpinbox ändert be.setCallback (Rückruf) # Griffregistrierung in BinEditor Rückruf bei Änderung

MultiBinEditor.py


import tkinter as tk

class HexSpinbox(tk.Spinbox):
    def __init__(self, *args, **kwargs):
        self.var = tk.StringVar()
        self.bytenum = kwargs.pop('bytenum', 1)
        self.add_callback = None
        max_val = 0x1<<(self.bytenum*8)
        super().__init__(*args, **kwargs, textvariable=self.var, from_=0,to=max_val,
                         increment=1, command=self.callback )

    def set(self, val):
        s = "0x{:0%dx}" % (self.bytenum*2)
        self.var.set(s.format(int(val)))
        
    def get(self):
        hstr = super().get()
        return int(hstr, 16)

    def callback(self):
        val = super().get()
        self.set(val)
        self.add_callback(val) if self.add_callback != None else None

    def setCallback(self, func):
        self.add_callback = func

class BinEditFrame(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.val = 0x00
        self.bits = []
        self.add_callback = None
        for i in range(8):
            btn = tk.Button(self,text=str(i), relief='raised', command=self.callback(i))
            btn.pack(sid='right')
            self.bits.append(btn)

    def callback(self, i):
        def push():
            self.val ^= (1<<i)
            self.redraw()
            self.add_callback(self.val) if self.add_callback != None else None
        return push

    def redraw(self):
        #All Button Delete
        for bit in self.bits:
            bit.destroy()
        self.bits.clear()
            
        #All Button ReCreate
        for i in range(8):
            if (self.val & (1<<i) > 0):
                btn = tk.Button(self,text=str(i), relief='sunken',
                                command=self.callback(i) )
            else:
                btn = tk.Button(self,text=str(i), relief='raised',
                                command=self.callback(i) )
            btn.pack(sid='right')
            self.bits.append(btn)
        
        
    def setCallback(self, func):
        self.add_callback = func

    def set(self, val):
        self.val = int(val)
        self.redraw()

if __name__ == "__main__":
    print("BinHexEditor")
    win = tk.Tk()
    hx = HexSpinbox(win)
    hx.pack(side=tk.LEFT)
    be = BinEditFrame(win)
    be.pack(side=tk.LEFT)

    def callback(i):
        hx.set(i)
        be.set(i)

    hx.setCallback(callback)
    be.setCallback(callback)
        
    win.mainloop()

Recommended Posts

Testen Sie den Tkinter-bezogenen Rückruf
Testen Sie den Tkinter-bezogenen Rückruf 2
Prüfung