用户如何选择网格的整行?
在下面的代码中,网格的任何单元格都是可选的,但不是一行。我希望用户能够选择并且能够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()
答案 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()