[PYTHON] Test de rappel interrelié de Tkinter

Laissez Hex SpinBox et Bin Editor interagir les uns avec les autres

Que veux-tu faire

hextobin.png Si vous changez cela, cela changera. Si vous changez cela, cela changera. Est-ce un peu gênant de faire fonctionner les interfaces graphiques entre elles?

Ce que j'ai fait

En enregistrant les fonctions de rappel dans les gestionnaires de chacun J'ai essayé de pouvoir communiquer les changements de l'autre. Il peut y avoir une implémentation plus simple, mais nous avons d'abord pu interagir.

hextobin2.png

def callback (i): #Generate callback function Définir la valeur dans chaque case hx.set(i) be.set(i)

hx.setCallback (callback) #Call callback quand il y a un changement dans l'enregistrement du gestionnaire dans HexSpinbox be.setCallback (callback) #Handle registration dans BinEditor Callback quand il y a un changement

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

Test de rappel interrelié de Tkinter
Test du rappel interrelié Tkinter 2
tester