Как предотвратить изменение местоположения одного элемента сетки из-за обновления содержимого другого элемента сетки в python tkinter? - PullRequest
0 голосов
/ 18 мая 2019

Я написал код для небольшого приложения на python tkinter, который выглядит следующим образом

import tkinter as tk

from tkinter import *
import tkinter.filedialog as fdialog

class karl(Frame):
  def __init__(self):
    tk.Frame.__init__(self)
    self.pack(fill = tk.BOTH)
    self.master.title("Image Selector")
    self.master.geometry("500x500")
    self.master.resizable(0, 0)
    self.pack_propagate(0)

    self.label_button_1 = Label(self, text="Select directory for picking images")
    self.label_button_1.grid(row = 0, column = 1, rowspan = 1, columnspan = 2, sticky = W)

    self.button_1 = tk.Button(self, text="CLICK HERE", width=25, command=self.open_dialog_box_to_select_folder)
    self.button_1.grid(row=0, column=20, rowspan=1, columnspan=2, sticky=E)

    self.label_for_label_directory = Label(self, text="Current chosen directory")
    self.label_for_label_directory.grid(row=20, column=1, rowspan=1, columnspan=2, sticky=E)

    self.label_directory = Label(self, text="")
    self.label_directory.grid(row=20, column=5, rowspan=1, columnspan=2, sticky=W)

    self.label_for_entry_for_class_label_values = Label(self, text="Enter text")
    self.label_for_entry_for_class_label_values.grid(row = 24, column = 1, rowspan = 1, columnspan = 2, sticky = W)

    self.entry_for_class_label_values = Entry(self)
    self.entry_for_class_label_values.grid(row = 24, column = 5, rowspan = 1, columnspan = 2, sticky = E)


  def open_dialog_box_to_select_folder(self):

    self.chosen_directory_name = fdialog.askdirectory()
    self.label_directory.config(text = self.chosen_directory_name)



def main():
   karl().mainloop()

if __name__ == '__main__':
   main()  

Как только нажата button_1 и label_directory обновляется со строкой для каталога, позиция button_1 сдвигается вправо и выходит за пределы окна приложения. Как я могу остановить , чтобы это случилось?

1 Ответ

0 голосов
/ 18 мая 2019

Проблема в том, что когда вы выбираете папку и обновляете self.label_directory Строкой пути к выбранной папке, она манипулирует сеткой и расширяет ваш Click Here Button.

Чтобы решить эту проблему, сначала button_1 должен иметь опцию sticky, установленную на W, чтобы он не перемещался справа от своей ячейки сетки, когда манипулируют шириной его ячеек сетки.

Другая проблема, с которой вы столкнулись, заключается в том, что вы слишком сильно увеличиваете количество строк и столбцов в сетке, вам следует увеличивать только на необходимые пробелы, например, начинать со строки 1, а затем помещать следующую строку во строку 2. это помогает убедиться, что легко понять, где находится каждый элемент.

После всего сказанного я верю, что этот код исправит проблему соответствующим образом:

import tkinter as tk

from tkinter import *
import tkinter.filedialog as fdialog

class karl(Frame):
  def __init__(self):
    tk.Frame.__init__(self)
    self.pack(fill = tk.BOTH)
    self.master.title("Image Selector")
    self.master.geometry("500x500")
    self.master.resizable(0, 0)
    self.pack_propagate(0)

    self.label_button_1 = Label(self, text="Select directory for picking images")
    self.label_button_1.grid(row = 0, column = 0, columnspan = 1, sticky = W)

    self.button_1 = tk.Button(self, text="CLICK HERE", width=25, command=self.open_dialog_box_to_select_folder)
    self.button_1.grid(row=0, column=1, columnspan=2, sticky=W)

    self.label_for_label_directory = Label(self, text="Current chosen directory")
    self.label_for_label_directory.grid(row=1, column=0, rowspan=1, columnspan=1, sticky=W)

    self.label_directory = Label(self, text="")
    self.label_directory.grid(row=1, column=1, rowspan=1, columnspan=2, sticky=W)

    self.label_for_entry_for_class_label_values = Label(self, text="Enter (+) seperated class labels\nto be assigned to the images")
    self.label_for_entry_for_class_label_values.grid(row = 2, column = 0, rowspan = 1, columnspan = 2, sticky = W)

    self.entry_for_class_label_values = Entry(self)
    self.entry_for_class_label_values.grid(row = 2, column = 1, rowspan = 1, columnspan = 1, sticky = W)


  def open_dialog_box_to_select_folder(self):

    self.chosen_directory_name = fdialog.askdirectory()
    self.label_directory.config(text = self.chosen_directory_name)



def main():
   karl().mainloop()

if __name__ == '__main__':
    main()

Я изменил ранее упомянутые элементы для достижения этой цели, если у вас есть какие-либо вопросы о моем решении, не стесняйтесь спрашивать:)

Вот ваша программа tkinter, преобразованная в файл Excel. Чтобы визуализировать, как работает система координатной сетки, светло-синий - то место, куда будет помещена строка вашего пути при выборе папки.

enter image description here

Когда вы выбираете длинный путь к файлу, метка path_label расширяется (светло-голубая часть Excel, это будет нажимать кнопку click me вправо. Так далеко вправо, что она будет нажимать кнопку в области просмотра окон вот так.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...