选择网格的一行

时间:2018-10-18 19:30:36

标签: python tkinter

用户如何选择网格的整行?

在下面的代码中,网格的任何单元格都是可选的,但不是一行。我希望用户能够选择并且能够ctrl-c将其放入复制缓冲区。

import os

try:
    import Tkinter as tk
    import tkFont
    import ttk

    from Tkconstants import CENTER, LEFT, N, E, W, S
    from Tkinter import StringVar
    from Tkinter import Text

except ImportError: # py3k
    import tkinter as Tkinter
    import tkinter.font as tkFont
    import tkinter.ttk as ttk

    from tkinter.constants import CENTER, LEFT, N, E, W, S
    from tkinter import Text

def displayList(root, frame, zoo_list):

    TOTAL_WIDTH = 225   
    TOTAL_HEIGHT = 200
    dialog_size = str(TOTAL_WIDTH)+'x'+str(TOTAL_HEIGHT)
    root.geometry(dialog_size)

    grid_row = 0;
    for animal in zoo_list:
         try:
            species = animal[0]
            name = animal[1]
            age = animal[2]

         except IndexError:
            print ("[ERROR] IndexError: " + str(grid_row) )

         textProjectId = Text(frame,  width=10, height=1, borderwidth=1) # width and height for Text widget are in characters, not pixels 
         textProjectId.insert(1.0, species)
         textProjectId.grid(row=grid_row, column=0, sticky=("W", "E"))
         textProjectId.config(state='disabled')

         textProjectId = Text(frame,  width=10, height=1, borderwidth=1) # width and height for Text widget are in characters, not pixels 
         textProjectId.insert(1.0, name)
         textProjectId.grid(row=grid_row, column=1, sticky=("W", "E"))
         textProjectId.config(state='disabled')

         textProjectId = Text(frame,  width=4, height=1, borderwidth=1) # width and height for Text widget are in characters, not pixels 
         textProjectId.insert(1.0, age)
         textProjectId.grid(row=grid_row, column=2, sticky=("W", "E"))
         textProjectId.config(state='disabled')

         grid_row+=1   # next project

def onFrameConfigure(canvas):
    '''Reset the scroll region to encompass the inner frame'''
    canvas.configure(scrollregion=canvas.bbox("all"))

def buildGUI():

    root = Tkinter.Tk()
    canvas = Tkinter.Canvas(root, borderwidth=0, background="#ffffff")
    frame = Tkinter.Frame(canvas, background="#ffffff")
    verticalScrollbar = Tkinter.Scrollbar(root, orient="vertical", command=canvas.yview)
    canvas.configure(yscrollcommand=verticalScrollbar.set)
    verticalScrollbar.pack(side="right", fill="y")
    canvas.pack(side="left", fill="both", expand=True)
    canvas.create_window((4, 4), window=frame, anchor="nw")
    frame.bind("<Configure>", lambda event, canvas=canvas:onFrameConfigure(canvas))

    root.wm_title("Python Examples")

    return frame, root

def main():

    print ("[DEBUG]*** Python Examples ***)\n");

    ## data -------------------------------------------------------------------------
    zoo_list = [ ('bear', 'Bob', 11),  
                       ('lion', 'Larry', 4), 
                       ('panda', 'Pete', 5),
                       ('zebra', 'Zane', 7),
                       ('chimpanzee', 'Chet', 2),
                       ('gorilla', 'Gary', 23),
                       ('orangutan', 'Oliver', 46),
                       ('gibbon', 'Glen', 14) ]

    print('\r'.join(map(str,zoo_list)))

    ## GUI ------------------------------------------------------------------------------

    frame, root = buildGUI()
    displayList(root, frame, zoo_list)
    root.mainloop()

    print ("\n[DEBUG]*** Done  - Python Examples ***");

# main ###############################################################################

if __name__ == "__main__":
    # stuff only to run when not called via 'import' here
    main()

1 个答案:

答案 0 :(得分:2)

我已经修改了您的代码,以便能够使用按钮选择行。有点粗糙,但应该显示出如何使用列表和按钮复制整行项目。

通过添加一个列表并监视for循环中的索引,我们可以为每一行创建一个按钮,以获取每一行的所有值。通过将每个值保存到新列表并使用按钮调用的函数引用索引来完成此操作。我敢肯定,这可以做得更好一些。

import tkinter as tk

def displayList(root, frame, zoo_list):
    global list_of_values_per_row
    TOTAL_WIDTH = 225   
    TOTAL_HEIGHT = 200
    dialog_size = str(TOTAL_WIDTH) + 'x' + str(TOTAL_HEIGHT)
    root.geometry(dialog_size)

    list_of_values_per_row = []

    for ndex, animal in enumerate(zoo_list):
        try:
            species = animal[0]
            name = animal[1]
            age = animal[2]
            list_of_values_per_row.append([animal[0], animal[1], animal[2]])
        except IndexError:
            print ("[ERROR] IndexError: " + str(ndex))

        tk.Button(frame, text="Select", height=1, borderwidth=1, command=lambda x=ndex: append_selection_to_clipboard(x)).grid(row=ndex, column=0)
        textProjectId = tk.Text(frame,  width=10, height=1, borderwidth=1) 
        textProjectId.insert(1.0, species)
        textProjectId.grid(row=ndex, column=1, sticky="ew")
        textProjectId.config(state='disabled')

        textProjectId = tk.Text(frame,  width=10, height=1, borderwidth=1) 
        textProjectId.insert(1.0, name)
        textProjectId.grid(row=ndex, column=2, sticky="ew")
        textProjectId.config(state='disabled')

        textProjectId = tk.Text(frame,  width=4, height=1, borderwidth=1) 
        textProjectId.insert(1.0, age)
        textProjectId.grid(row=ndex, column=3, sticky="ew")
        textProjectId.config(state='disabled')

def append_selection_to_clipboard(x):
    global list_of_values_per_row
    all_row = list_of_values_per_row[x]
    new_string = "{} {} {}".format(all_row[0], all_row[1], all_row[2])
    root.clipboard_clear()
    root.clipboard_append(new_string)
    print(new_string)
    root.update()

def onFrameConfigure(canvas):
    canvas.configure(scrollregion=canvas.bbox("all"))

def buildGUI():
    root = tk.Tk()
    canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
    frame = tk.Frame(canvas, background="#ffffff")
    verticalScrollbar = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
    canvas.configure(yscrollcommand=verticalScrollbar.set)
    verticalScrollbar.pack(side="right", fill="y")
    canvas.pack(side="left", fill="both", expand=True)
    canvas.create_window((4, 4), window=frame, anchor="nw")
    frame.bind("<Configure>", lambda event, canvas=canvas:onFrameConfigure(canvas))
    root.wm_title("Python Examples")
    return frame, root

if __name__ == "__main__":
    zoo_list = [ ('bear', 'Bob', 11), ('lion', 'Larry', 4), ('panda', 'Pete', 5), ('zebra', 'Zane', 7),
                 ('chimpanzee', 'Chet', 2), ('gorilla', 'Gary', 23), ('orangutan', 'Oliver', 46), ('gibbon', 'Glen', 14) ]
    frame, root = buildGUI()
    displayList(root, frame, zoo_list)
    root.mainloop()

如果您想要更多的OOP,下面是您对我进行的一些更改将执行的类版本:

import tkinter as tk

zoo_list = [ ('bear', 'Bob', 11), ('lion', 'Larry', 4), ('panda', 'Pete', 5), ('zebra', 'Zane', 7),
             ('chimpanzee', 'Chet', 2), ('gorilla', 'Gary', 23), ('orangutan', 'Oliver', 46), ('gibbon', 'Glen', 14) ]

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
        self.frame = tk.Frame(self.canvas, background="#ffffff")
        verticalScrollbar = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=verticalScrollbar.set)
        verticalScrollbar.pack(side="right", fill="y")
        self.canvas.pack(side="left", fill="both", expand=True)
        self.canvas.create_window((4, 4), window=self.frame, anchor="nw")
        self.frame.bind("<Configure>", self.onFrameConfigure)
        self.wm_title("Python Examples")
        self.lt = []
        self.displayList()

    def displayList(self):
        TOTAL_WIDTH = 225   
        TOTAL_HEIGHT = 200
        dialog_size = "{}x{}".format(TOTAL_WIDTH, TOTAL_HEIGHT)
        self.geometry(dialog_size)

        for ndex, animal in enumerate(zoo_list):
            tk.Button(self.frame, text="Select", height=1, borderwidth=1,
                      command=lambda x=ndex: self.append_selection_to_clipboard(x)).grid(row=ndex, column=0)
            self.lt.append([tk.Text(self.frame,  width=10, height=1, borderwidth=1),
                       tk.Text(self.frame,  width=10, height=1, borderwidth=1),
                       tk.Text(self.frame,  width=4, height=1, borderwidth=1)])

            self.lt[ndex][0].insert(1.0, animal[0])
            self.lt[ndex][0].grid(row=ndex, column=1, sticky="ew")
            self.lt[ndex][0].config(state='disabled')
            self.lt[ndex][1].insert(1.0, animal[1])
            self.lt[ndex][1].grid(row=ndex, column=2, sticky="ew")
            self.lt[ndex][1].config(state='disabled')
            self.lt[ndex][2].insert(1.0, animal[2])
            self.lt[ndex][2].grid(row=ndex, column=3, sticky="ew")
            self.lt[ndex][2].config(state='disabled')

    def append_selection_to_clipboard(self, x):
        new_string = "{} {} {}".format(self.lt[x][0].get(1.0, "end-1c"),
                                       self.lt[x][1].get(1.0, "end-1c"),
                                       self.lt[x][2].get(1.0, "end-1c"))
        self.clipboard_clear()
        self.clipboard_append(new_string)
        print(new_string)
        self.update()

    def onFrameConfigure(self, event=None):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))


if __name__ == "__main__":
    App().mainloop()