Tkinter – Columnspan无法获得期望的结果:如何使小部件到达它们期望的位置?

huangapple go评论93阅读模式
英文:

Tkinter - Columnspan does not bring desired result: How to get widgets to their desired place?

问题

以下是您提供的文本的中文翻译部分:

我正在为一个文件组织程序构建GUI。程序本身可以运行,但我在将我的小部件放在正确位置时遇到了问题。问题是:我的滚动条和文本框之间有太多的空间,如附图所示(实际外观和我想要的外观):

我确信问题出在columnspan上:
我的原始网格中的每个坐标都乘以10。

我的第一列是column=10

我的第二列是column=20

我的第三列是column=30
...

我的第一行是row=10

我的第二行是row=20

我的第三行是row=30
...

使用columnspan 我认为这将使将其他小部件放在后面变得更容易。我认为我在某个地方搞砸了,因为现在一个小部件不会去我想要它去的地方,我无法弄清楚为什么。我忽略了一些东西,但我就是看不到它。我知道这是很多代码,但真正相关的唯一是坐标/网格系统。
删除空文件夹复选框文本框滚动条

非常感谢您的帮助,我在此提前向您表示感谢。

Github项目链接:
https://github.com/kormuch/python_file_organizer/tree/main/file%20organizer%20v2.22

代码:

(以下是代码的部分,不包含在翻译内)

请注意,由于提供的文本非常长,我只提供了其中的一部分翻译。如果您需要更多内容的翻译,请告诉我。

英文:

I am buildung a GUI for a file oranizer program. The program itself works, but I am having issues with getting my widgets into the right spot. The problem: I have too much space between my scrollbars and my textboxes, as you can see in the screenshot attached (how it looks like and what I want it too look like):Tkinter – Columnspan无法获得期望的结果:如何使小部件到达它们期望的位置?

Tkinter – Columnspan无法获得期望的结果:如何使小部件到达它们期望的位置?

I am certain the problem lies with the columnspan:
Every coordinate in my original grid is times 10.

My first column is column=10

My second column is column=20

My third column is column=30
...

My first row is row=10

My second row is row=20

My third row is row=30

and so on...

Using columnspan I figured this would make it easier to squeeze other widgets in later on. I think I messed this all up somewhere, because now a widget is not going where I want it to go and I cannot figure out why. I overlooked something, but I just don't see it. I know it's a lot of code, but the only thing relevant really is the coordinates/grid system.
The delete empty folder Checkbox and the textbox scrollbars.
Your help is very much appreciated and I thank you very much in advance.

The link to the project on Github:
https://github.com/kormuch/python_file_organizer/tree/main/file%20organizer%20v2.22

the code:

  1. from tkinter import *
  2. from tkinter import ttk
  3. import tkinter.font as TkFont
  4. import json
  5. import os
  6. root = Tk()
  7. root.title('File Organiser V0.1')
  8. root.geometry("1600x730")
  9. #directories with relative paths
  10. dir_source_files = r'sourcefiles'
  11. dir_destination = r'destination'
  12. dir_logfiles = r'logfiles'
  13. main_frame = Frame(root)
  14. main_frame.pack(fill=BOTH, expand=1)
  15. # Create A Canvas
  16. main_canvas = Canvas(main_frame)
  17. main_canvas.pack(side=LEFT, fill=BOTH, expand=1)
  18. # Configure The Canvas
  19. # Add A Scrollbar To the main canvas
  20. main_scrollbar = ttk.Scrollbar(main_frame, orient=VERTICAL, command=main_canvas.yview)
  21. main_scrollbar.pack(side=RIGHT, fill=Y)
  22. main_canvas.configure(yscrollcommand=main_scrollbar.set, scrollregion=main_canvas.bbox("all"))
  23. main_canvas.bind_all('<MouseWheel>', lambda event: main_canvas.yview_scroll(int(-1*(event.delta/120)), "units"))
  24. main_canvas.bind('<Configure>', lambda e: main_canvas.configure(scrollregion = main_canvas.bbox("all")))
  25. # Create ANOTHER Frame INSIDE the Canvas
  26. second_frame = Frame(main_canvas)
  27. # Add that New frame To a Window In The Canvas
  28. main_canvas.create_window((0,0), window=second_frame, anchor="nw")
  29. #font for labels
  30. helv12_bold = TkFont.Font(family="Helvetica",size=12,weight="bold")
  31. font_textbox = TkFont.Font(family="Helvetica",size=9,weight="bold")
  32. # configure the grid
  33. instructions = Label(second_frame,
  34. text=" 1. Place your files in the source folder\n 2. Check/Uncheck your sorting options\n 3. Press 'Run File Organizer'",
  35. font=(helv12_bold),
  36. bd=1,
  37. justify="left")
  38. instructions.grid(column=1, row=5, sticky=W, pady=10, padx=10, ipadx=1, ipady= 10)
  39. #creating a listbox with sourcefiles
  40. label_sourcefiles = Label(second_frame, text=f"Sourcefiles:", font=helv12_bold)
  41. label_sourcefiles.grid(column=1, columnspan=9, row=30, sticky=W, pady=(10,0), padx=10, ipadx=1, ipady= 0)
  42. listbox_sourcefiles = Listbox(second_frame, width=60, height=30, borderwidth=3)
  43. listbox_sourcefiles.grid(column=1, columnspan=9, row=40, rowspan=100, sticky=W, pady=0, padx=(10,0), ipadx=1, ipady= 1)
  44. scrollbar = Scrollbar(second_frame)
  45. scrollbar.grid(column=10, columnspan=9, row=40, rowspan=100, sticky=NS)
  46. scrollbar.config(command = listbox_sourcefiles.yview)
  47. listbox_sourcefiles.config(font = (font_textbox),
  48. yscrollcommand=scrollbar.set)
  49. scrollbar = Scrollbar(second_frame, orient = 'horizontal')
  50. scrollbar.grid(column=1, columnspan=9, row=140, sticky=EW, padx=(10,0))
  51. scrollbar.config(command = listbox_sourcefiles.xview)
  52. listbox_sourcefiles.config(xscrollcommand=scrollbar.set)
  53. # creating labels and Textboxes with keywords
  54. #textbox 1
  55. label_keywords_text_box_01 = Entry(second_frame, width=40)
  56. label_keywords_text_box_01.grid(column=30, columnspan=9, row=30, sticky=W, pady=(10,0), padx=25, ipadx=1, ipady= 0)
  57. label_keywords_text_box_01.config(background = "white", font = font_textbox)
  58. display_keywords_text_box_01 = Text(second_frame, width=50, height=5, borderwidth=3)
  59. display_keywords_text_box_01.grid(column=30, columnspan=9, row=40, sticky=W, pady=0, padx=(25,0), ipadx=1, ipady= 1)
  60. display_keywords_text_box_01.config(background = "white", font = font_textbox)
  61. scrollbar = Scrollbar(second_frame)
  62. scrollbar.grid(column=40, columnspan=1, row=40, sticky=NS)
  63. scrollbar.config(command = display_keywords_text_box_01.yview)
  64. display_keywords_text_box_01.config(yscrollcommand=scrollbar.set)
  65. #textbox 2
  66. label_keywords_text_box_02 = Entry(second_frame, width=40)
  67. label_keywords_text_box_02.grid(column=30, columnspan=9, row=60, sticky=W, pady=(10,0), padx=25, ipadx=1, ipady= 0)
  68. label_keywords_text_box_02.config(background = "white", font = font_textbox)
  69. display_keywords_text_box_02 = Text(second_frame, width=50, height=5, borderwidth=3)
  70. display_keywords_text_box_02.grid(column=30, columnspan=9, row=70, sticky=W, pady=0, padx=(25,0), ipadx=1, ipady= 1)
  71. display_keywords_text_box_02.config(background = "white", font = font_textbox)
  72. scrollbar = Scrollbar(second_frame)
  73. scrollbar.grid(column=40, row=70, sticky=NS)
  74. scrollbar.config(command = display_keywords_text_box_02.yview)
  75. display_keywords_text_box_02.config(yscrollcommand=scrollbar.set)
  76. #textbox 3
  77. label_keywords_text_box_03 = Entry(second_frame, width=40)
  78. label_keywords_text_box_03.grid(column=30, columnspan=9, row=90, sticky=W, pady=(10,0), padx=25, ipadx=1, ipady= 0)
  79. label_keywords_text_box_03.config(background = "white", font = font_textbox)
  80. display_keywords_text_box_03 = Text(second_frame, width=50, height=5, borderwidth=3)
  81. display_keywords_text_box_03.grid(column=30, columnspan=9, row=100, sticky=W, pady=0, padx=(25,0), ipadx=1, ipady= 1)
  82. display_keywords_text_box_03.config(background = "white", font = font_textbox)
  83. scrollbar = Scrollbar(second_frame)
  84. scrollbar.grid(column=40, row=100, sticky=NS)
  85. scrollbar.config(command = display_keywords_text_box_03.yview)
  86. display_keywords_text_box_03.config(yscrollcommand=scrollbar.set)
  87. # creating dst listboxes
  88. # listbox 1
  89. dst_folder_name_01 = Label(second_frame, text=f"1")
  90. dst_folder_name_01.grid(column=80, row=30, sticky=W, pady=(10,0), padx=10, ipadx=1, ipady= 0)
  91. display_files_list_box_01 = Listbox(second_frame, width=60, height=5, borderwidth=3)
  92. display_files_list_box_01.grid(column=80, row=40, sticky=W, pady=0, padx=(10,0), ipadx=1, ipady= 1)
  93. scrollbar = Scrollbar(second_frame)
  94. scrollbar.grid(column=90, row=40, sticky=NS)
  95. scrollbar.config(command = display_files_list_box_01.yview)
  96. display_files_list_box_01.config(font = (font_textbox),
  97. yscrollcommand=scrollbar.set)
  98. scrollbar = Scrollbar(second_frame, orient = 'horizontal')
  99. scrollbar.grid(column=80, row=50, sticky=EW, padx=(10,0))
  100. scrollbar.config(command = display_files_list_box_01.xview)
  101. display_files_list_box_01.config(xscrollcommand=scrollbar.set)
  102. # listbox 2
  103. dst_folder_name_02 = Label(second_frame, text=f"2")
  104. dst_folder_name_02.grid(column=80, row=60, sticky=W, pady=(10,0), padx=10, ipadx=1, ipady= 0)
  105. display_files_list_box_02 = Listbox(second_frame, width=60, height=5, borderwidth=3)
  106. display_files_list_box_02.grid(column=80, row=70, sticky=W, pady=0, padx=(10,0), ipadx=1, ipady= 1)
  107. scrollbar = Scrollbar(second_frame)
  108. scrollbar.grid(column=90, row=70, sticky=NS)
  109. scrollbar.config(command = display_files_list_box_02.yview)
  110. display_files_list_box_02.config(font = (font_textbox),
  111. yscrollcommand=scrollbar.set)
  112. scrollbar = Scrollbar(second_frame, orient = 'horizontal')
  113. scrollbar.grid(column=80, row=80, sticky=EW, padx=(10,0))
  114. scrollbar.config(command = display_files_list_box_02.xview)
  115. display_files_list_box_02.config(xscrollcommand=scrollbar.set)
  116. # listbox 3
  117. dst_folder_name_03 = Label(second_frame, text=f"3")
  118. dst_folder_name_03.grid(column=80, row=90, sticky=W, pady=(10,0), padx=10, ipadx=1, ipady= 0)
  119. display_files_list_box_03 = Listbox(second_frame, width=60, height=5, borderwidth=3)
  120. display_files_list_box_03.grid(column=80, row=100, sticky=W, pady=0, padx=(10,0), ipadx=1, ipady= 1)
  121. scrollbar = Scrollbar(second_frame)
  122. scrollbar.grid(column=90, row=100, sticky=NS)
  123. scrollbar.config(command = display_files_list_box_03.yview)
  124. display_files_list_box_03.config(font = (font_textbox),
  125. yscrollcommand=scrollbar.set)
  126. scrollbar = Scrollbar(second_frame, orient = 'horizontal')
  127. scrollbar.grid(column=80, row=110, sticky=EW, padx=(10,0))
  128. scrollbar.config(command = display_files_list_box_03.xview)
  129. display_files_list_box_03.config(xscrollcommand=scrollbar.set)
  130. def save_content_textboxes():
  131. dict_textBox_01={label_keywords_text_box_01.get(): display_keywords_text_box_01.get('1.0','end-1c')}
  132. dict_textBox_02={label_keywords_text_box_02.get(): display_keywords_text_box_02.get('1.0','end-1c')}
  133. dict_textBox_03={label_keywords_text_box_03.get(): display_keywords_text_box_03.get('1.0','end-1c')}
  134. list_of_dict_textBoxes =[dict_textBox_01, dict_textBox_02, dict_textBox_03]
  135. json_content = json.dumps(list_of_dict_textBoxes)
  136. with open("saved keywords raw.json", "w") as outfile:
  137. outfile.write(json_content)
  138. dict_textBoxes = {
  139. label_keywords_text_box_01.get(): display_keywords_text_box_01.get('1.0','end-1c'),
  140. label_keywords_text_box_02.get(): display_keywords_text_box_02.get('1.0','end-1c'),
  141. label_keywords_text_box_03.get(): display_keywords_text_box_03.get('1.0','end-1c'),
  142. }
  143. with open("saved keywords raw.json") as infile:
  144. dicts_textBoxes_CLEAN = {}
  145. data = json.load(infile)
  146. for entry in data:
  147. for key_raw, value_raw in entry.items():
  148. if key_raw == "":
  149. break
  150. value_raw.replace("\\t", "").replace("\\n", "").replace("\\r", "")
  151. value_raw = "".join(value_raw.split("\n"))
  152. value_raw = "".join(value_raw.split("\t"))
  153. value_raw = "".join(value_raw.split("\r"))
  154. dicts_textBoxes_CLEAN[key_raw] = value_raw
  155. json_content = json.dumps(dicts_textBoxes_CLEAN, indent = 4)
  156. with open("saved keywords clean.json", "w") as outfile:
  157. outfile.write(json_content)
  158. def display_dst_listboxes():
  159. json_object_open = open("saved keywords clean.json")
  160. saved_keywords_clean_json = json.load(json_object_open)
  161. list_of_dicts_dstFolderNames_and_keywords = []
  162. list_seen_sourcefiles = []
  163. list_seen_sourcefiles_and_matching_keywords = []
  164. for key, value in saved_keywords_clean_json.items():
  165. dict_dstFolder_and_keywords = {key:value}
  166. list_of_dicts_dstFolderNames_and_keywords.append(dict_dstFolder_and_keywords)
  167. print("List of dictionaries with Foldernames and Keywords generated, here is the list:")
  168. print(str(list_of_dicts_dstFolderNames_and_keywords))
  169. print("")
  170. print("Now iterating through the list of dictionaries from textboxes")
  171. try:
  172. for dstFolderName, keywords_with_hashtags in list_of_dicts_dstFolderNames_and_keywords[0].items():
  173. list_unseenSrcFiles_and_therefore_to_be_moved = []
  174. for sourcefile in os.scandir(dir_source_files):
  175. if sourcefile in list_seen_sourcefiles:
  176. print(f"file {sourcefile.name} was already seen")
  177. continue
  178. else:
  179. keywords_without_hashtags = keywords_with_hashtags.rstrip().split('#') #automatically creates list and removes the hashtag from every keyword
  180. keywords_without_hashtags.remove('') #removes empty entries from list
  181. keywords_without_hashtags
  182. for keyword in keywords_without_hashtags:
  183. keyword=keyword.rstrip()
  184. if keyword.lower() in sourcefile.name.lower():
  185. print(f"keyword '{keyword}' found in sourcefile '{sourcefile.name}'")
  186. list_seen_sourcefiles.append(sourcefile)
  187. list_seen_sourcefiles_and_matching_keywords.append("#" + keyword + ": " + sourcefile.name)
  188. list_seen_sourcefiles=list(set(list_seen_sourcefiles))
  189. list_unseenSrcFiles_and_therefore_to_be_moved.append(sourcefile)
  190. print(f"the following files will be moved:")
  191. print(list_unseenSrcFiles_and_therefore_to_be_moved)
  192. dst_folder_name_01.config(text=dstFolderName)
  193. display_files_list_box_01.delete(0,END)
  194. for sourcefile_to_be_moved in list_unseenSrcFiles_and_therefore_to_be_moved:
  195. print(f"Willl move {sourcefile_to_be_moved} to destination folder")
  196. for sourcefile_name_and_matching_keyword in list_seen_sourcefiles_and_matching_keywords:
  197. display_files_list_box_01.insert(END, sourcefile_name_and_matching_keyword)
  198. except IndexError:
  199. pass
  200. try:
  201. for dstFolderName, keywords_with_hashtags in list_of_dicts_dstFolderNames_and_keywords[1].items():
  202. list_unseenSrcFiles_and_therefore_to_be_moved = []
  203. for sourcefile in os.scandir(dir_source_files):
  204. if sourcefile in list_seen_sourcefiles:
  205. print(f"file {sourcefile.name} was already seen")
  206. continue
  207. else:
  208. keywords_without_hashtags = keywords_with_hashtags.rstrip().split('#') #automatically creates list and removes the hashtag from every keyword
  209. keywords_without_hashtags.remove('') #removes empty entries from list
  210. keywords_without_hashtags
  211. for keyword in keywords_without_hashtags:
  212. keyword=keyword.rstrip()
  213. if keyword.lower() in sourcefile.name.lower():
  214. print(f"keyword '{keyword}' found in sourcefile '{sourcefile.name}'")
  215. list_seen_sourcefiles.append(sourcefile)
  216. list_seen_sourcefiles=list(set(list_seen_sourcefiles))
  217. list_unseenSrcFiles_and_therefore_to_be_moved.append(sourcefile)
  218. print(f"the following files will be moved:")
  219. print(list_unseenSrcFiles_and_therefore_to_be_moved)
  220. display_files_list_box_02.delete(0,END)
  221. for sourcefile_name in list_unseenSrcFiles_and_therefore_to_be_moved:
  222. display_files_list_box_02.insert(END, sourcefile_name.name)
  223. except IndexError:
  224. pass
  225. try:
  226. for dstFolderName, keywords_with_hashtags in list_of_dicts_dstFolderNames_and_keywords[2].items():
  227. list_unseenSrcFiles_and_therefore_to_be_moved = []
  228. for sourcefile in os.scandir(dir_source_files):
  229. if sourcefile in list_seen_sourcefiles:
  230. print(f"file {sourcefile.name} was already seen")
  231. continue
  232. else:
  233. keywords_without_hashtags = keywords_with_hashtags.rstrip().split('#') #automatically creates list and removes the hashtag from every keyword
  234. keywords_without_hashtags.remove('') #removes empty entries from list
  235. keywords_without_hashtags
  236. for keyword in keywords_without_hashtags:
  237. keyword=keyword.rstrip()
  238. if keyword.lower() in sourcefile.name.lower():
  239. print(f"keyword '{keyword}' found in sourcefile '{sourcefile.name}'")
  240. list_seen_sourcefiles.append(sourcefile)
  241. list_seen_sourcefiles=list(set(list_seen_sourcefiles))
  242. list_unseenSrcFiles_and_therefore_to_be_moved.append(sourcefile)
  243. print(f"the following files will be moved:")
  244. print(list_unseenSrcFiles_and_therefore_to_be_moved)
  245. display_files_list_box_03.delete(0,END)
  246. for sourcefile_name in list_unseenSrcFiles_and_therefore_to_be_moved:
  247. display_files_list_box_03.insert(END, sourcefile_name.name)
  248. except IndexError:
  249. pass
  250. # Get State functions
  251. def get_state_extract_from_folders():
  252. if state_extract_boolean.get():
  253. print("Extract files from folders is set TRUE")
  254. return(True)
  255. if not state_extract_boolean.get():
  256. print("Extract files from folders is set FALSE")
  257. return(False)
  258. def get_state_delete_emptyFolders():
  259. if state_delete_boolean.get():
  260. print("Delete empty folders after moving files is set TRUE")
  261. return(True)
  262. if not state_delete_boolean.get():
  263. print("Delete empty folders after moving files is set FALSE")
  264. return(False)
  265. state_extract_boolean=IntVar()
  266. Checkbutton(second_frame, text = "Extract files\n from parentfolders", variable=state_extract_boolean, onvalue=1,
  267. offvalue=0, command=get_state_extract_from_folders).grid(column=30, columnspan=1, row=5, sticky=W, padx=(10,0), ipadx=10, ipady= 10)
  268. state_delete_boolean=IntVar()
  269. Checkbutton(second_frame, text = "Delete\nempty folders", variable=state_delete_boolean, onvalue=1,
  270. offvalue=0, command=get_state_delete_emptyFolders).grid(column=35, columnspan=1, row=5, sticky=W, padx=(10,0), ipadx=10, ipady= 10)
  271. button_check_for_keywords = Button(second_frame,
  272. text = "Match Keywords",
  273. bg = "lightblue",
  274. font= ('Arial 12'),
  275. command = lambda:[
  276. save_content_textboxes(),
  277. display_dst_listboxes(),
  278. print("button_check_for_keywords pressed")
  279. ]
  280. )
  281. button_check_for_keywords.grid(column=1, row=10, sticky=W, padx=(10,0), pady=(10,10), ipadx=10, ipady=10)
  282. button_Run_File_Organizer = Button(second_frame,
  283. text = "Run File Organizer",
  284. font= ('Arial 12'),
  285. command = lambda:[
  286. get_state_extract_from_folders(),
  287. get_state_delete_emptyFolders(),
  288. #create_folders_and_move_files()
  289. ]
  290. )
  291. button_Run_File_Organizer.grid(column=1, row=1, sticky=W, padx=(10,0), pady=(10,10), ipadx=10, ipady=10)
  292. # The setup - filling the textboxes at the start
  293. for sourcefile in os.scandir(dir_source_files):
  294. listbox_sourcefiles.insert(END,sourcefile.name)
  295. try:
  296. json_object_open = open("saved keywords raw.json")
  297. json_object_data = json.load(json_object_open)
  298. for key_textbox_label, value_textbox_keywords in json_object_data[0].items():
  299. label_keywords_text_box_01.insert(END,key_textbox_label)
  300. display_keywords_text_box_01.insert(END, value_textbox_keywords)
  301. for key_textbox_label, value_textbox_keywords in json_object_data[1].items():
  302. label_keywords_text_box_02.insert(END,key_textbox_label)
  303. display_keywords_text_box_02.insert(END, value_textbox_keywords)
  304. for key_textbox_label, value_textbox_keywords in json_object_data[2].items():
  305. label_keywords_text_box_03.insert(END,key_textbox_label)
  306. display_keywords_text_box_03.insert(END,value_textbox_keywords)
  307. except ValueError:
  308. pass
  309. root.mainloop()

答案1

得分: 1

我找到了:
#textbox 6缺少columnspan=9。

英文:

I found it:
#textbox 6 lacked columnspan=9.

huangapple
  • 本文由 发表于 2023年3月3日 21:42:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/75627831.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定