2015-09-27 2 views
-4

Есть ли способ сделать код, который генерирует мои кнопки короче? Может ли кто-нибудь показать мне, как это сделать? Есть идеи?Укорачивание кода или сокращение кода для моего калькулятора?

Clear = Button(buttons, bg="snow", text="C", width=7, height=1, command=self.clear, relief=RAISED) 
    Clear.grid(padx=2, pady=2, column=3, row=0) 
    Equals = Button(buttons, bg="snow", text="=", width=7, height=1, command=self.equals, relief=RAISED) 
    Equals.grid(padx=2, pady=2, column=4, row=3) 
    All_clear = Button(buttons, bg="snow", text="AC", width=7, height=1, command=self.all_clear, relief=RAISED) 
    All_clear.grid(padx=2, pady=2, column=4, row=0) 
    Bracket_one = Button(buttons, bg="snow", text="(", width=7, height=1, command=self.bracket_one, relief=RAISED) 
    Bracket_one.grid(padx=2, pady=2, column=2, row=3) 
    Bracket_two = Button(buttons, bg="snow", text=")", width=7, height=1, command=self.bracket_two, relief=RAISED) 
    Bracket_two.grid(padx=2, pady=2, column=3, row=3) 
    Zero = Button(buttons, bg="snow", text="0", width=7, height=1, command=self.zero, relief=RAISED) 
    Zero.grid(padx=2, pady=2, column=0, row=3) 
    Decimal_point = Button(buttons, bg="snow", text=".", width=7, height=1, command=self.decimal_point, relief=RAISED) 
    Decimal_point.grid(padx=2, pady=2, column=1, row=3) 
    Multiplication = Button(buttons, bg="red", text="x", width=7, height=1, command=self.multiplication, relief=RAISED) 
    Multiplication.grid(padx=2, pady=2, column=3, row=1) 
    Division = Button(buttons, bg="powder blue", text="/", width=7, height=1, command=self.division, relief=RAISED) 
    Division.grid(padx=2, pady=2, column=4, row=1) 
    Addition = Button(buttons, bg="yellow", text="+", width=7, height=1, command=self.addition, relief=RAISED) 
    Addition.grid(padx=2, pady=2, column=3, row=2) 
    Subtraction = Button(buttons, bg="green", text="-", width=7, height=1, command=self.subtraction, relief=RAISED) 
    Subtraction.grid(padx=2, pady=2, column=4, row=2) 
+0

Если это ** рабочий код **, который, по вашему мнению, может быть улучшен, рассмотрите [codereview.se] – jonrsharpe

ответ

1

Используйте список с параметрами:

buttons = [ 
    dict(column=3, row=0, text="C", command=self.clear), 
    dict(column=4, row=3, text="=", command=self.equals), 
    dict(column=4, row=0, text="AC", command=self.all_clear), 
    dict(column=2, row=3, text="(", command=self.bracket_one), 
    dict(column=3, row=3, text=")", command=self.bracket_two), 
] 
for data in buttons: 
    button = Button(buttons, bg="snow", text=data['text'], width=7, height=1, command=data['command'], relief=RAISED) 
    button.grid(padx=2, pady=2, column=data['column'], row=data['row']) 
+1

Почему бы просто не распаковать каждый 'dict' с помощью' ** '? – TigerhawkT3

+0

Вероятно, не стоит называть этот список кнопок '' '' '' '' '' '' ', так как это выглядит как корневой виджет OP для сетки Button. –

+0

@ TigerhawkT3: Поскольку некоторые из полей необходимо передать конструктору 'Button', а некоторые из них нужно передать методу' .grid' кнопки. –

0

В качестве модифицированных альтернатив решения Даниила:

buttons = [ 
    ({'text':"C", 'command':self.clear}, {'column':3, 'row':0}), 
    ({'text':"=", 'command':self.equals}, {'column':4, 'row':3}), 
    ({'text':"AC", 'command':self.all_clear}, {'column':4, 'row':0}), 
    ({'text':"(", 'command':self.bracket_one}, {'column':2, 'row':3}), 
    ({'text':")", 'command':self.bracket_two}, {'column':3, 'row':3}) 
] 
for data in buttons: 
    button = Button(buttons, width=7, height=1, relief=RAISED, **data[0]) 
    button.grid(padx=2, pady=2, **data[1]) 

Это будет захватить соответствующий словарь и распаковать его содержимое в ключевые аргументы. Одно из преимуществ этого заключается в том, что вы можете добавить, скажем, bitmap к одной из кнопок, не добавляя их к другим.

Смежные вопросы