簡體   English   中英

如何創建一個填充父類的 *args 和 **kwargs 的子類?

[英]How to make a subclass that fills *args and **kwargs of the parent?

我正在嘗試在 tkinter 中創建一個按鈕子類,以便它自動填充一些 args 和 kwargs。 我不確定這是 python 問題還是 tkinter 問題。

from tkinter import *

root = Tk()

class MyButton(Button):
    def __init__(self, *args, **kwargs):
        super(Button).__init__(*args, **kwargs)

    kwargs = {"padx": 40, "pady": 20}
    args = (root)


test = Numbutton(text = "48")

test.pack()

root.mainloop()

錯誤是:

Traceback (most recent call last):
  File "my file directory", line 18, in <module>
    test = Numbutton(text = "xyz", *args, **kwargs)
  File "my tkinter directory", line 1489, in cget
    return self.tk.call(self._w, 'cget', '-' + key)
TypeError: can only concatenate str (not "int") to str

任何幫助表示贊賞:)

這是第一刺:

from tkinter import *

root = Tk()

class MyButton(Button):
    def __init__(self, *args, **kwargs):
        super().__init__(root, padx=40, pady=20,**kwargs)

test = MyButton(text = "48")
test.pack()
root.mainloop()

編輯:

這是一種更好的方法,可用於使用初始 kwargs 而不是硬編碼初始 kwargs 來創建子類:

from tkinter import Tk, Button


def set_button_initial(*initial_args, **initial_kwargs):
    class ButtonClassWithInitialStuff(Button):
        def __init__(self, *args, **kwargs):
            super().__init__(*initial_args, **initial_kwargs, **kwargs)
    return ButtonClassWithInitialStuff


root = Tk()

ButtonClass1 = set_button_initial(root, {"padx": 40, "pady": 20})
ButtonClass2 = set_button_initial(root, {"padx": 10, "pady": 50})

ButtonObject1a = ButtonClass1(text="48")
ButtonObject1b = ButtonClass1(text="49")
ButtonObject2 = ButtonClass2(text='second')
ButtonObject1c = ButtonClass1(text="50")

ButtonObject1a.pack()
ButtonObject1b.pack()
ButtonObject2.pack()
ButtonObject1c.pack()

root.mainloop()

注意,對於函數 set_button_initial,我們返回的是類 ButtonClassWithInitialStuff,而不是對象 ButtonClassWithInitialStuff(),即我們設置了構造函數(init),但我們還沒有使用它。

使用該函數,我們創建了 ButtonClass1 和 ButtonClass2 類。

然后,我們實例化我們剛剛創建的類的對象 ButtonObject1a-c 和 ButtonObject1。 注意:我們可以重用這些類來創建任意數量的對象,而無需重新調用 set_button_initial

(編輯以解釋評論者提出的問題)

據我所知@MisterMiyagi 建議使用

from functools import partial

def set_button_initial(*initial_args, **initial_kwargs):
    return partial(Button, *initial_args, **initial_kwargs)

它看起來表現相同,但在不丟失信息的情況下看起來更好看,因此更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM