Использование условного оператора для связывания нажатия кнопки - PullRequest
0 голосов
/ 06 июля 2018

Идея состоит в том, что, если нажать одну из кнопок, помеченный текст вводится в верхнем левом поле ввода. Первоначально я планировал использовать оператор if при нажатии кнопки, а затем вставлять текст в соответствии с.

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

from tkinter import *
from tkinter import ttk

class GUI():

    def __init__(self, master):

        self.master = master
        master.resizable(True, True)
        master.title('Conversion Calculator')

        self.tabControl = ttk.Notebook(master)
        self.tab1 = ttk.Frame(self.tabControl)  # tab set up
        self.tabControl.add(self.tab1, text='Builder')
        self.tabControl.pack(expand=1, fill="both")        


        self.builder_entrybox = ttk.Entry(self.tab1, width=24) # entry box set up
        self.builder_entrybox.grid(column=0, row=0)

        self.builder_outputbox = ttk.Entry(self.tab1, width=24)    # output box set up
        self.builder_outputbox.grid(column=0, row=1)
        self.builder_outputbox.config(state='NORMAL')
        self.builder_outputbox.config(state='readonly')

        self.CH3_Button = ttk.Button(self.tab1, text='CH3', command=self.builder) # CH3 button
        self.CH3_Button.grid(column=1, row=0)

        self.CH2_Button = ttk.Button(self.tab1, text='CH2', command=self.builder) # CH2 button
        self.CH2_Button.grid(column=2, row=0)

        self.OH_Button = ttk.Button(self.tab1, text='OH', command=self.builder) # OH button
        self.OH_Button.grid(column=1, row=1)

        self.O_Button = ttk.Button(self.tab1, text='O', command=self.builder) # O button
        self.O_Button.grid(column=2, row=1)

        self.H_Button = ttk.Button(self.tab1, text='H', command=self.builder) # H button
        self.H_Button.grid(column=3, row=1)

        self.COOH_Button = ttk.Button(self.tab1, text='COOH', command=self.builder) # COOH button
        self.COOH_Button.grid(column=3, row=0)

class Logic(GUI):

    def builder (self): # adding button text to entry box (tab1)

            self.builder_entrybox.insert(0, 'CH3')

if __name__ == "__main__":
    root = Tk()
    test = Logic(root)

1 Ответ

0 голосов
/ 06 июля 2018

Да, вы бы сделали новую функцию для каждой кнопки:

class GUI():
    def __init__(self, master):
        # ...

        self.CH3_Button = ttk.Button(self.tab1, text='CH3', command=self.CH3_builder) # CH3 button
        self.CH3_Button.grid(column=1, row=0)

    def CH3_builder(self):
        self.builder_entrybox.insert('end', 'CH3')

Python может создавать функции на лету, либо с functools.partial (раннее связывание) или lambda (позднее связывание). Используя это, вы можете написать то же самое, как это:

from functools import partial

class GUI():
    def __init__(self, master):
        # ...

        self.CH3_Button = ttk.Button(self.tab1, text='CH3', command=partial(self.builder_entrybox.insert, 'end', 'CH3')) # CH3 button
        self.CH3_Button.grid(column=1, row=0)

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

from tkinter import ttk
import tkinter as tk

class Copa(ttk.Button):
    """A new type of Button that moves the text into a Entry when clicked"""
    def __init__(self, master=None, **kwargs):
        ttk.Button.__init__(self, master, command=self.builder, **kwargs)
    def builder(self):
        self.master.builder_entrybox.insert('end', self['text'])

class BuilderFrame(tk.Frame):
    def __init__(self, master=None, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)

        self.builder_entrybox = ttk.Entry(self, width=24) # entry box set up
        self.builder_entrybox.grid(column=0, row=0)

        self.builder_outputbox = ttk.Entry(self, width=24)    # output box set up
        self.builder_outputbox.grid(column=0, row=1)
        self.builder_outputbox.config(state='NORMAL')
        self.builder_outputbox.config(state='readonly')

        self.CH3_Button = Copa(self, text='CH3') # CH3 button
        self.CH3_Button.grid(column=1, row=0)

        self.CH2_Button = Copa(self, text='CH2') # CH2 button
        self.CH2_Button.grid(column=2, row=0)

        self.OH_Button = Copa(self, text='OH') # OH button
        self.OH_Button.grid(column=1, row=1)

        self.O_Button = Copa(self, text='O') # O button
        self.O_Button.grid(column=2, row=1)

        self.H_Button = Copa(self, text='H') # H button
        self.H_Button.grid(column=3, row=1)

        self.COOH_Button = Copa(self, text='COOH') # COOH button
        self.COOH_Button.grid(column=3, row=0)

class GUI():
    def __init__(self, master):

        self.master = master
        master.resizable(True, True)
        master.title('Conversion Calculator')

        self.tabControl = ttk.Notebook(master)
        self.tab1 = BuilderFrame(self.tabControl)  # tab set up
        self.tabControl.add(self.tab1, text='Builder')
        self.tabControl.pack(expand=1, fill="both")

if __name__ == "__main__":
    root = tk.Tk()
    test = GUI(root)
    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...