代码之家  ›  专栏  ›  技术社区  ›  Al Lelopath

选择网格的一行

  •  0
  • Al Lelopath  · 技术社区  · 6 年前

    在下面的代码中,网格的任何单元格都是可选的,但不是一行。我希望用户能够选择,并且能够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 回复  |  直到 6 年前
        1
  •  2
  •   Mike - SMT    6 年前

    通过添加一个列表并监视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()
    

    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()