Позиционирование радиокнопок в LabelFrame - PullRequest
0 голосов
/ 16 мая 2018

как я могу выровнять кнопки симметрично, чтобы они идеально сидели в рамке и имели одинаковое расстояние до сторон и соседей

Мой подход был таким, но он не дает правильного результата ...

class MyApproach():

    def __init__(self):
        self.radiobutton_name_list = {"radio1": "This_is_text",
                                  "radio2": "This_is_mid_text",
                                  "radio3": "This_is_loooooooong_text"}
        self.create_root()
        self.create_label_frame()
        self.create_radiobuttons()
        self.mainloop()

    def create_root(self):
        self.root = Tk()
        self.root.geometry("740x120")
        self.root.title("test")
        self.root.resizable(False, False)

    def create_label_frame(self):
        self.new_labelframe = LabelFrame(self.root, text='My Frame', relief=GROOVE, bd=2)
        self.new_labelframe.place(width=720, height=80, x=10, y=10)

    def create_radiobuttons(self):
        self.radiobutton_xposition = 10
        for radiobuttons in self.radiobutton_name_list:
            if not len(self.radiobutton_name_list) <= 4: break
            Radiobutton(self.new_labelframe, text=self.radiobutton_name_list[radiobuttons]).place(
                        x=self.radiobutton_xposition, y=10)
            self.radiobutton_xposition += len(self.radiobutton_name_list[radiobuttons])

    def mainloop(self):
        self.root.mainloop()


app = MyApproach()

Я не знаю, как сделать расчет, но "self.radiobutton_xposition + = len (self.radiobutton_name_list [radiobuttons])" неверно и (* =) я думаю, что это неправильный подход

спасибо, ребята

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Обновлен:

Самое быстрое решение, которое я могу придумать, - это указать вес для каждого столбца, а затем поместить туда свои кнопки. У места есть свои моменты, но по большей части вы можете решить проблемы размещения с помощью pack() или grid().

Здесь мы будем использовать сетку и генерировать номера столбцов с диапазоном.

Попробуйте следующее:

from tkinter import *

class MyApproach():

    def __init__(self):
        # updated the data here so it would be easier to run a loop over it.
        self.radiobutton_name_list = {0: ["radio1", "This_is_text"],
                                  1: ["radio2", "This_is_mid_text"],
                                  2: ["radio3", "This_is_loooooooong_text"]}

        self.create_root()
        self.create_label_frame()
        self.create_radiobuttons()
        self.mainloop()

    def create_root(self):
        self.root = Tk()
        self.root.geometry("740x120")
        self.root.title("test")
        self.root.resizable(False, False)

    def create_label_frame(self):
        self.new_labelframe = LabelFrame(self.root, text='My Frame', relief=GROOVE, bd=2)
        self.new_labelframe.place(width=720, height=80, x=10, y=10)

    def create_radiobuttons(self):
        # using len and range to get the key of the radio button list.
        # this same key number can be used as the column as well.
        for i in range(len(self.radiobutton_name_list)):
            self.new_labelframe.columnconfigure(i, weight=1)
            Radiobutton(self.new_labelframe, text=self.radiobutton_name_list[i][1]).grid(row=0, column=i, sticky="nsew")

    def mainloop(self):
        self.root.mainloop()


app = MyApproach()
0 голосов
/ 16 мая 2018

Вообще говоря, использование места в качестве менеджера геометрии доставляет вам больше проблем, чем решает. Почему вы не используете пакет?

from tkinter import *

class MyApproach():

    def __init__(self):
        self.radiobutton_name_list = {"radio1": "This_is_text",
                                  "radio2": "This_is_mid_text",
                                  "radio3": "This_is_loooooooong_text"}
        self.create_root()
        self.create_label_frame()
        self.create_radiobuttons()
        self.mainloop()

    def create_root(self):
        self.root = Tk()
        self.root.geometry("740x120")
        self.root.title("test")
        self.root.resizable(False, False)

    def create_label_frame(self):
        self.new_labelframe = LabelFrame(self.root, text='My Frame', relief=GROOVE, bd=2)
        self.new_labelframe.pack(expand=1, fill=BOTH, padx=10, pady=10)

    def create_radiobuttons(self):
        self.v = StringVar()
        self.v.set(' ')
        for radiobuttons in self.radiobutton_name_list:
            r = Radiobutton(self.new_labelframe, text=self.radiobutton_name_list[radiobuttons], variable=self.v, value=radiobuttons)
            r.pack(side=LEFT, padx=10, expand=1, fill=X)

    def mainloop(self):
        self.root.mainloop()


app = MyApproach()
...