热门标签:
Q:

如何在Python Tkinter中将radiobutton的文本标签移动到按钮下方?

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

下面是使用我正在使用的grid放置的几个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()

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

src=

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

谢谢,拉杰

原网址
A:

没有选项可以在radiobutton中设置文本位置,所以我能想到的最简单的解决方法是删除radiobutton文本并在其下方放置一个标签。

此外,我宁愿让一个MainGUI类继承自Tk而不是Frame,这样你就不必在if __name__ == '__main__':部分中创建一个根窗口,但这只是一个建议。

from tkinter import *
from tkinter import ttk

class MainGUI(Tk):

    def __init__(self):
        Tk.__init__(self)
        self.geometry("300x100")
        self.configure(background="white")
        self.mainframe = ttk.Frame(self, 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,  value=0).grid(column=1, row=2)
        ttk.Label(self.mainframe, text="Button 1").grid(column=1, row=3, padx=4)
        ttk.Radiobutton(self.mainframe,  value=1).grid(column=2, row=2)
        ttk.Label(self.mainframe, text="Button 2").grid(column=2, row=3, padx=4)
        ttk.Radiobutton(self.mainframe,  value=2).grid(column=3, row=2)
        ttk.Label(self.mainframe, text="Button 3").grid(column=3, row=3, padx=4)
        ttk.Radiobutton(self.mainframe,  value=3).grid(column=4, row=2)
        ttk.Label(self.mainframe, text="Button 4").grid(column=4, row=3, padx=4)
        self.mainloop()

if __name__ == '__main__':
    app = MainGUI()

<img alt="结果"src="https://i.stack.imgur.com/4h2GR.png缧/>

备注:为了获得这张图片,我还使用attk.Style在linux中获得了更好的结果。

所有回答

共 2 条

author avatar

正如Sun Bear建议的那样,获取按钮下方radiobutton标签的另一种方法是自定义ttk样式:

from tkinter import *
from tkinter import ttk

class MainGUI(Tk):

    def __init__(self):
        Tk.__init__(self)
        self.geometry("300x100")
        self.configure(background="white")
        self.mainframe = ttk.Frame(self, 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)
        style = ttk.Style(self)
        style.theme_use('clam')
        # create custom radiobutton style layout
        style.layout('CustomRadiobutton', 
                     [('Radiobutton.padding',
                       {'children': 
                           [('Radiobutton.indicator', 
                             {'side': 'top', 'sticky': ''}), # changed side from left to top
                            ('Radiobutton.focus',
                             {'children': [('Radiobutton.label', {'sticky': 'nswe'})],
                              'side': 'top', # changed side from left to top
                              'sticky': ''})],
                        'sticky': 'nswe'})])
        style.configure('TFrame', background="white")
        style.configure('CustomRadiobutton', background="white")
        ttk.Radiobutton(self.mainframe, style='CustomRadiobutton',
        text="Button 1", value=0).grid(column=1, row=2, padx=4)
        ttk.Radiobutton(self.mainframe, style='CustomRadiobutton',
        text="Button 2", value=1).grid(column=2, row=2, padx=4)
        ttk.Radiobutton(self.mainframe, style='CustomRadiobutton',
        text="Button 3", value=2).grid(column=3, row=2, padx=4)
        ttk.Radiobutton(self.mainframe, style='CustomRadiobutton',
        text="Button 4", value=3).grid(column=4, row=2, padx=4)
        self.mainloop()

if __name__ == '__main__':
    app = MainGUI()

但是,这并不适用于所有ttk主题。 它适用于clamalt,但给出了无法在linux中使用classicdefault选择的按钮。

author avatar

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

其元素的布局似乎由一个标签组成,该标签位于焦点内部,该标签位于指示器内部,该标签位于填充内部(参见下面的变量rbLayout)。 的Radiobutton。指标的侧面选项值为左。 的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'>

更新:

  1. 我认为rbLayout变量显示默认情况下 Radiobutton。padding包含两个子元素,即 Radiobutton。指示剂和Radiobutton。焦点,并且它们被定位 在Radiobutton的左侧。填充物。 此外, Radiobutton。焦点包含Radiobutton。标签。 更正我的 较早的解释。
  2. 为了实现所描述的布局,我认为Radiobutton。指标的 'side'键应该有'top'和'sticky'键应该有 值'n'。 此外,Radiobutton。焦点的"侧"键应该有 值'bottom'和'sticky'值应该是's'。
  3. 我创建了一个脚本来实现更改。 请参阅下面的代码。 但是,它没有工作。 我很惊讶radiobutton布局做了 没有改变。 我不明白为什么它不起作用。

希望有更多知识的人可以解释为什么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)

更新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)

带有顶部指示器和底部标签的Radiobutton

  • 要更改Radiobutton指示器的位置以显示在其标签的顶部,更改为Radiobutton。指标的"侧面"值到"顶部"只需要。 放射性同位素的变化。focus的"side"值对Radiobutton的布局没有影响。
  • 相似问题