如何在Python Tkinter中的按钮下方移动单选按钮的文本标签?

Raj*_*bal 6 python tkinter radio-button

我想知道是否有办法将radiobutton的标签文本移动到不同的区域,例如在实际按钮下方.

下面是一个使用我正在使用的网格放置的几个radiobutton的示例:

from tkinter import *
from tkinter import ttk


class MainGUI(Frame):

    def __init__(self, parent):
        self.parent = parent
        Frame.__init__(self, parent, background="white")
        self.mainframe = ttk.Frame(root, padding="8 8 12 12")
        self.mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
        self.mainframe.columnconfigure(0, weight=1)
        self.mainframe.rowconfigure(0, weight=1)
        ttk.Radiobutton(self.mainframe, text="Button 1", value=0).grid(column=1, row=2)
        ttk.Radiobutton(self.mainframe, text="Button 2", value=1).grid(column=2, row=2)
        ttk.Radiobutton(self.mainframe, text="Button 3", value=2).grid(column=3, row=2)
        ttk.Radiobutton(self.mainframe, text="Button 4", value=3).grid(column=4, row=2)

if __name__ == '__main__':
    root = Tk()
    root.geometry("300x100")
    app = MainGUI(root)
    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

下面是代码运行时帧的图像:

你可以看到默认是在按钮的一侧,但我正在寻找一种方法来移动下面的文本,我似乎找不到任何解决这个问题的方法!

谢谢,拉吉

Sun*_*ear 4

我的想法是尝试修改 ttk.RadioButton 的布局元素或元素的选项。请参阅http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-layouts.html

其元素的布局似乎由一个标签组成,该标签位于焦点内部,位于指示器内部,位于填充内部(参见下面的变量 rbLayout)。Radiobutton.indicator 的侧面选项值保留。Radiobutton.label 的锚点选项显示为空白。我认为改变这些选项中的任何一个都可能得到你想要的。您还必须将选项“style=your_customed_stylename”添加到您的 ttk.Radiobutton 声明中。

>>> import tkinter.ttk as ttk
>>> s = ttk.Style()
>>> rb = ttk.Radiobutton(None, text='RB1')
>>> rbClass = rb.winfo_class()
>>> rbClass
'TRadiobutton'
>>> rbLayout = s.layout('TRadiobutton')
>>> rbLayout
[('Radiobutton.padding', {'sticky': 'nswe', 'children': [('Radiobutton.indicator', {'sticky': '', 'side': 'left'}), ('Radiobutton.focus', {'children': [('Radiobutton.label', {'sticky': 'nswe'})], 'sticky': '', 'side': 'left'})]})]
>>> type(rbLayout)
<class 'list'>
Run Code Online (Sandbox Code Playgroud)

更新:

  1. 我认为 rbLayout 变量显示默认情况下 Radiobutton.padding 包含两个子元素,即 Radiobutton.indicator 和 Radiobutton.focus,它们位于 Radiobutton.padding 的左侧。此外,Radiobutton.focus包含Radiobutton.label。纠正我之前的解释。
  2. 为了实现所描述的布局,我认为 Radiobutton.indicator 的“side”键应具有值“top”,“sticky”键应具有值“n”。此外,Radiobutton.focus 的“side”键应具有值“bottom”,“sticky”值应为“s”。
  3. 我创建了一个脚本来实现这些更改。请参阅下面的代码。然而,这并没有奏效。我很惊讶单选按钮布局没有改变。不明白为什么它不起作用。

希望更有知识的人能够解释为什么对 Radiobutton 元素布局的修改没有更改为所需的布局。

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry("300x100")

s = ttk.Style()
m = s.layout('TRadiobutton')
print('TRadiobutton.Layout : Default')
print(m , "\n")

# Change to default Radiobutton.indicator elements
list(list(m[0])[1]['children'][0])[1]['side'] = 'top'
list(list(m[0])[1]['children'][0])[1]['sticky'] = 'n'

# Change to default Radiobutton.focus elements
list(list(m[0])[1]['children'][1])[1]['side']='bottom'
list(list(m[0])[1]['children'][1])[1]['sticky']='s'

print('TRadiobutton.Layout : Amended')
print(m, "\n")

frame1 = ttk.Frame(root)
frame1.grid()
rb1 = ttk.Radiobutton(frame1, text="Button 1")
rb1.grid()

root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
Run Code Online (Sandbox Code Playgroud)

更新 2:解决方案

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.geometry("300x100")

s = ttk.Style()
s.theme_use('default')

print('TRadiobutton.Layout : Default')
print(s.layout('TRadiobutton'), "\n")

s.layout('TRadiobutton',
         [('Radiobutton.padding',
           {'children':
            [('Radiobutton.indicator', {'side': 'top', 'sticky': ''}), # Just need to change indicator's 'side' value
             ('Radiobutton.focus', {'side': 'left',
                                    'children':
                                    [('Radiobutton.label', {'sticky': 'nswe'})],
                                    'sticky': ''})],
            'sticky': 'nswe'})])

print('TRadiobutton.Layout : Amended')
print(s.layout('TRadiobutton'), "\n")

frame1 = ttk.Frame(root)
frame1.grid()
rb1 = ttk.Radiobutton(frame1, text="Button 1")
rb1.grid()

root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
Run Code Online (Sandbox Code Playgroud)

带有顶部指示器和底部标签的单选按钮

非常感谢 j_4321 基于我建议的方法提供的最新解决方案。我已经将它实现(见上文)到我之前的代码中并且它有效。我想强调以下几点:

  1. 我的代码显示对单选按钮的默认样式“TRadiobutton”的布局所做的更改,而不是使用更改的布局创建新样式。这种差异的优点似乎克服了 j_4321 第二个解决方案提到的缺点。也就是说,它适用于所有 ttk 主题(“clam”、“alt”、“default”、“classic”),而不仅仅是“clam”和“alt”。至少这可以在我的 Linux 16.04 平台上运行。
  2. 我之前的代码中的错误是我创建了 s.layout() 的新实例(即 m = s.layout())并更改了它的布局,而不是实际更改默认 Radiobutton 样式 s.layout( 'TR单选按钮')。我从 j_4321 的解决方案中了解到,可以通过将小部件布局的更改细节添加为元组 ttk.Style.layout(小部件的默认样式名称)中的第二项来更改默认样式的布局,即ttk.Style.layout(小部件的默认样式名称,例如 'TRadiobutton', [已更改小部件的布局详细信息])
  3. 要将 Radiobutton 指示器的位置更改为显示在其标签的顶部,只需将Radiobutton.indicator 的 'side' 值更改为 'top'即可。对 Radiobutton.focus 的“side”值的更改对 Radiobutton 的布局没有影响。