Как поменять фон ткинтера. Кнопка через нажатие на нее - PullRequest
0 голосов
/ 26 июня 2018

По сути, я хочу вызвать нестатическую и неглобальную функцию через command = *function parameter*


Я хочу создать tkinter.Button, который меняет свой цвет при нажатии.

Я пытался создать подкласс, чтобы добавить дополнительные атрибуты, которые имеют другие оффтоп преимущества:

import tkinter as tk

class Cell(tk.Button):

    def __init__(self, master, coord , command, bg = "ghost white", state = 0):
        tk.Button.__init__(self, master, bg = bg, height = height, width = width, relief = relief, bd = bd)
        self.coord = coord
        self.state = state

    def switch(self):
        if self.state:
            self.state = 0
            self.config(bg = "gray1")
        else:
            self.state = 1
            self.config(bg = "ghost white")

Но вкратце я хотел бы сделать что-то вроде этого:

tk.Button(master, command = lambda: self.config(bg = "color"))

Возможно ли это?


EDIT : Дальнейший контекст, потому что я думаю, что мое объяснение не совсем поняло сообщение за границей. И еще сообщения об ошибках:

Моя основная концепция: Мне нужна прямоугольная сетка, в которой вы можете щелкнуть ячейку, и ячейка изменит цвет с белого на черный или наоборот. Поскольку у меня не было никакой другой идеи (не очень знакомой с Tkinter), я использовал кнопки, но если у кого-то есть идея получше, мне было бы очень интересно

Проблемы:

  1. Если я попытаюсь использовать self., я получу

    NameError: имя 'self' не определено

в заголовке функции - без ее вызова. Так что это не сработает.

  1. Я мог бы просто сделать

    cell = tk.Button (master, command = cell.switch)

Но у меня очень много кнопок, и я храню их в массиве

board = []
for i in range(x):
    row = []
    for j in range(y):
        # Button or selfmade Cell class - no difference
        cell = tk.Button(master, command = 'needed')
        row.append(cell)
    board.append(row)

моя установка

Я попробовал следующие варианты:

  1. command = board[x][y].switch поднимает Ошибка индекса . Предположительно, потому что индекс не существует на момент объявления

    • с lambda: board[x][y].switch: я не получаю ошибку, но ничего не происходит при нажатии
    • с lambda: board[x][y].switch(): я не получаю ошибку, но он вызывает переключение только на последнюю ячейку, добавленную в массив
  2. command = lambda: board[x][y].config(bg = "grey1") - работает нормально, но каждая кнопка меняет только цвет последней кнопки, добавленной в board

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете использовать лямбда-метод, чтобы изменить цвет кнопки, если она нажата.

Этот простой пример показывает принцип

import tkinter as tk

root = tk.Tk()

btn = tk.Button(root,text="click me", command = lambda: btn.config(bg="green"))
btn.grid()

root.mainloop()

При условии, что изменение цвета кнопки - это все, что вы хотите сделать, это работает нормально.

Если вы хотите, чтобы он делал что-то еще, а также менял цвет, попробуйте что-то вроде этого, которое, как вы предложили, создает новый класс, который наследует поведение tk.Button, но также меняет цвет при нажатии.

import tkinter as tk

root = tk.Tk()

class SpecialButton(tk.Button):
    def __init__(self, master=None, **kw):
        self.clicked_color = kw.pop('clickedbg','green')
        tk.Button.__init__(self,master,**kw)
        self.bind('<Button-1>',self.clicked)
    def clicked(self,*args):
        self['bg'] = self.clicked_color

def somethingElse():
    print("Doing something else")

btn = tk.Button(root,text="click me", command = lambda: btn.config(bg="green"))
btn.grid()
btn2 = SpecialButton(root,text="You can click me too", command=somethingElse, clickedbg='red')
btn2.grid()

root.mainloop()

Я добавил новое ключевое слово для этой кнопки clickedbg, которое вы можете использовать для настройки цвета кнопки.

0 голосов
/ 26 июня 2018

Если я понимаю ваш вопрос, вы должны вызывать в lambda функцию switch ()

tk.Button(master, command = lambda: self.switch())

Но я думаю, что вы можете играть больше с этим, например, вы можете добавить необязательный аргумент цвета:

def switch(self, *args):
  if args:
     self.state = args['state']
     self.config(bg = args['bg'])
  else:
      if self.state:
          self.state = 0
          self.config(bg = "gray1")
      else:
          self.state = 1
          self.config(bg = "ghost white")

Я делал подобные вещи раньше, но сейчас у меня нет проекта ...

Edit:

Я только что видел твою правку и думаю, что смогу тебе помочь ...

Попробуйте сделать функцию переключателя @staticmethod, чтобы вам не нужно было self.

Для этого вам нужно будет передать state и, если хотите, вы можете добавить *args, как показано выше ...

Не забывайте, что вы всегда можете присвоить command значение по умолчанию, затем после объявления объекта измените его.

Надеюсь, это вам поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...