我必须在一个框架中显示数十个单选按钮(按三个分组),并希望它们像文本一样流动:从左到右,当该行已满时,在下面创建第二行。
你会怎么做?
编辑:在一些好的评论之后我得到了这个:
import tkinter
root = tkinter.Tk()
root.title('Elementario')
root.attributes("-fullscreen", True)
text = tkinter.Text(root, wrap=tkinter.WORD)
text.pack(fill=tkinter.BOTH)
modules = [
{'name':'reset_display'},
{'name':'number_to_bin_str'},
{'name':'number_to_dec_str'},
{'name':'number_to_hex_str'},
{'name':'list_to_number'},
{'name':'list_to_bin_str'},
{'name':'list_to_dec_str'}]
mod_vars = {}
for mod in modules:
name = mod['name']
rb_frame = tkinter.Frame(text)
rb_frame.pack()
label = tkinter.Label(rb_frame, text=name)
label.grid(row=0, column=0)
mod_vars[name] = tkinter.StringVar(value="0")
rb_T = tkinter.Radiobutton(rb_frame, text="T",
variable=mod_vars[name], value="T",)
rb_T.grid(row=0, column=2)
rb_U = tkinter.Radiobutton(rb_frame, text="U",
variable=mod_vars[name], value="U")
rb_U.grid(row=0, column=3)
root.mainloop()
单选按钮位于文本小部件的中心,我找不到使它们从左到右然后从上到下流动的方法。
您需要使用
text.window_create("end", window=rb_frame)
将这些框架放入文本小部件中。
以下是修改后的代码:
import tkinter
root = tkinter.Tk()
root.title('Elementario')
#root.attributes("-fullscreen", True)
root.geometry("600x300") # use smaller window to show the effect
text = tkinter.Text(root, wrap=tkinter.WORD)
text.pack(fill=tkinter.BOTH, expand=1)
modules = [
{'name':'reset_display'},
{'name':'number_to_bin_str'},
{'name':'number_to_dec_str'},
{'name':'number_to_hex_str'},
{'name':'list_to_number'},
{'name':'list_to_bin_str'},
{'name':'list_to_dec_str'}]
mod_vars = {}
for mod in modules:
name = mod['name']
# give the frame a border to show the effect easier
rb_frame = tkinter.Frame(text, bd=1, relief="solid", bg="white")
#rb_frame.pack()
label = tkinter.Label(rb_frame, text=f"{name}:")
label.grid(row=0, column=0)
mod_vars[name] = tkinter.StringVar(value="0")
rb_T = tkinter.Radiobutton(rb_frame, text="T",
variable=mod_vars[name], value="T",)
rb_T.grid(row=0, column=2)
rb_U = tkinter.Radiobutton(rb_frame, text="U",
variable=mod_vars[name], value="U")
rb_U.grid(row=0, column=3)
# put the frame into the text widget
text.window_create("end", window=rb_frame, padx=1, pady=1)
root.mainloop()
结果: