TransWikia.com

Грамотность кода, проверка по типу и количеству аргументов, иконка по центру

Stack Overflow на русском Asked by biomotor on January 19, 2021

прошу помочь доработать код:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from tkinter import *
from tkinter.ttk import *

root = Tk()

global Theme
Theme = {
  'background':                 '#F2F2F2',    # главное окно        # фон
  'background_hover':           '#E5E5E5',    # главное окно        # фон при выделении
  'border':                     '#666666',    # главное окно        # граница
  'label':                      '#333333',    # иконка перемещения  # цвет
  'label_hover':                '#666666',    # иконка перемещения  # цвет при выделении
  'group_background':           '#F2F2F2',    # подгруппы           # фон
  'group_border':               '#D3D3D3',    # подгруппы           # граница
  'group_border_hover':         '#BBBBBB',    # подгруппы           # граница при выделении
  'context_background':         '#FFFFFF',    # контекстное меню    # фон
  'context_background_hover':   '#333333',    # контекстное меню    # фон при выделении
  'context_border':             '#333333',    # контекстное меню    # граница
  'button_background':          '#F2F2F2',    # кнопка              # фон
  'button_background_hover':    '#EFEFEF',    # кнопка              # фон при выделении
  'button_border':              '#ADADAD',    # кнопка              # граница
  'button_border_hover':        '#5F5F5F',    # кнопка              # граница при выделении

  'button_size':                32,           # кнопка              # размер
  'button_border_size':         1,            # кнопка              # толщина границы
}

class MFrame(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)   
        self.parent = parent
        self.initUI()

    def Left(self):
        print("Left mouse pressed")

    def Right(self):
        print("Right mouse pressed")

    def initUI(self):

        self.btn = MButton("i1.png", "i2.png", self.Left, self.Right)
        self.btn.pack()


class MButton():
    def __init__(self, *arg):
        self.limage = arg[0]
        self.himage = arg[1]
        self.lcommand = arg[2]
        self.rcommand = arg[3]

        arg=[self.limage]; self.create(arg)
        self.c.bind('<Leave>',    lambda event, arg=[self.limage]:    self.leave(event, arg))
        self.c.bind('<Enter>',    lambda event, arg=[self.himage]:    self.hover(event, arg))
        self.c.bind('<Button-1>', lambda event, arg=[self.lcommand]:  self.mouseLeft(event, arg))
        self.c.bind('<Button-3>', lambda event, arg=[self.rcommand]:  self.mouseRight(event, arg))

    def create(self, arg):
        bs=Theme['button_border_size']
        ics=Theme['button_size']
        fill=Theme['button_background']
        outline=Theme['button_border']
        
        self.c = Canvas(root, width=ics, height=ics)
        x = 1+bs; y = 1+bs; xs = ics-bs; ys = ics-bs;
        self.r = self.c.create_rectangle(x, y, xs, ys, fill=fill, outline=outline, width=bs)
        x = ics/2+bs; y = ics/2+bs;
        self.image = PhotoImage(file=arg[0])
        self.i = self.c.create_image(x, y, image=self.image)

    def hover(self, event, arg):
        fill=Theme['button_background_hover']
        outline=Theme['button_border_hover']

        self.c.itemconfig(self.r, fill=fill, outline=outline)
        self.image = PhotoImage(file=arg[0])
        self.c.itemconfig(self.i, image=self.image)

    def leave(self, event, arg):
        fill=Theme['button_background']
        outline=Theme['button_border']

        self.c.itemconfig(self.r, fill=fill, outline=outline)
        self.image = PhotoImage(file=arg[0])
        self.c.itemconfig(self.i, image=self.image)

    def mouseLeft(self, event, arg):
        arg[0]()

    def mouseRight(self, event, arg):
        arg[0]()

    def pack(self):
        self.c.pack()

if __name__ == '__main__':
    app = MFrame(root)
    root.mainloop()

1-Насколько правильно/грамотно сделано то, что имеется? Можно ли что-то улучшить?
2-После def __init__(self, *arg): необходимо сделать проверку (по типу и количеству аргументов), подскажите пожалуйста как?
3-После изменения размера границы, иконка уползает вбок, как исправить?

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP