【问题标题】:My Radiobutton is checked on creation我的单选按钮在创建时被选中
【发布时间】:2020-08-21 15:58:32
【问题描述】:

我的问题是在创建单选按钮时会自动选中它,我无法取消选中它。我在 x 和 y 维度的框架内创建它。 我已经尝试过 .deselect() 函数,但它没有任何改变 (Python 3.6)

代码:

frm = ttk.Frame(root)
frm.place(x=0,y=0,width=1000,height=1000)

Ek = ttk.Radiobutton(frm,text="text")
Ek.place(x=100,y=400)

还有照片: photo

【问题讨论】:

  • 那里没什么用处
  • @this_is_patrick:那里有很多有用的信息:“要获得正确的收音机行为,请确保组中的所有按钮都指向同一个变量,并使用 value 选项指定每个按钮代表什么值”。这些你都没有做。

标签: python tkinter


【解决方案1】:

首先,如果我们只是想修改您的代码以单独为我们提供一个未选中的单选按钮,那么这样做就可以了。

from tkinter import Tk, IntVar, Radiobutton, mainloop, ttk

root = Tk()

frm = ttk.Frame(root)

frm.place(x = 0, y = 0, width = 1000, height = 1000)

v = IntVar()

Ek = ttk.Radiobutton(frm, text = "text", variable = v, value = 1)

Ek.place(x = 100, y = 100)

mainloop()

除了开始和结束时的设置样板外,我们在原始代码中唯一需要更改的就是将参数 variable = v, value = 1 添加到 Radiobutton 调用中。

这些额外的参数在孤立的情况下并没有真正的意义,因为同样的原因通常只有一个单选按钮没有意义。一旦我们添加了其中两个,我们就可以更好地看到发生了什么。

在@Stack 发布的文档 (this thing) 中,第一个代码示例如下所示:

from Tkinter import *

master = Tk()

v = IntVar()

Radiobutton(master, text="One", variable=v, value=1).pack(anchor=W)
Radiobutton(master, text="Two", variable=v, value=2).pack(anchor=W)

mainloop()

如果我们运行它,默认情况下我们会得到两个 未选中 单选按钮。如果我们将value=1 部分更改为value=0,第一个单选按钮显示为选中状态,如果我们将value=2 更改为value=0,第二个单选按钮显示为选中状态。所以value=0 似乎给了我们默认选中的按钮,但我们还不知道为什么。让我们多做一些实验。

如果我们尝试删除新样本中的片段,直到我们回到更接近您最初编写的内容,我们可以看到发生了什么。完全删除 value 参数并像这样运行它:

Radiobutton(master, text="One", variable=v).pack(anchor=W)
Radiobutton(master, text="Two", variable=v).pack(anchor=W)

默认情况下没有选中任何按钮,但随后进一步删除 variable 参数以使代码看起来像您的原始调用:

Radiobutton(master, text="One").pack(anchor=W)
Radiobutton(master, text="Two").pack(anchor=W)

为我们提供了两个默认情况下都选中的按钮,这让我们回到了原来的问题。

基本上,我们在这里遇到了各种奇怪的极端情况,因为我们刚刚开始摆弄代码并忘记了单选按钮实际代表什么。

单选按钮的概念首先代表的是变量的值。不是整个变量,只是它可能等于的事物之一。单选按钮集本身合在一起,为我们提供了离散变量的可视化表示:一个可以处于 N 个状态之一的事物。

因此,Radiobuttons 的 API 自然会要求我们提供一些信息,例如“您希望我们使用什么 Python 变量来保存这些值?” (大致是variable 关键字)和“您希望我们在幕后将哪些值粘到每个按钮上以区分不同的状态?” (即value 关键字)。

正如预期的那样,代码在上述值为 1 和 2 的情况下效果最佳,因为在这种情况下,代码在概念上正确地反映了单选按钮的实际含义。当我们碰撞这些值或将它们设置为零或完全忽略它们时,事情会变得有点奇怪且难以预测,因为我们正在处理 tkinter API 的实现细节,而不是使用单选按钮的简单概念该 API 旨在实现。

笔记本电脑快死了,所以我要继续点击发送。希望这不是太罗嗦。祝你好运。 :)

【讨论】:

  • 带有解释的答案比纯代码的答案要好。您可能需要考虑添加解释为什么您的代码有效。
  • 感谢您的建议。我是stackoverflow的新手,所以我仍然在弄清楚回复等的约定。 :)
【解决方案2】:

单选按钮需要与一个特殊的 Tkinter 变量(StringVar 等)相关联,并且设计为以两个或多个为一组工作。如果您不指定变量,则会为您创建一个。单选按钮的默认值为空字符串,这也是默认变量将被设置为。

【讨论】:

【解决方案3】:

只需为声明的变量分配不同的值

from tkinter import Tk, IntVar, Radiobutton, mainloop, ttk

root = Tk()
frm = ttk.Frame(root)
frm.place(x=0,y=0,width=100,height=400)


language=StringVar(value='portuguese')


Ek = ttk.Radiobutton(frm,variable="language",text="spanish",value="spanish")
Ek.place(x=10,y=50)
Ek = ttk.Radiobutton(frm,variable="language",text="english",value="english")
Ek.place(x=10,y=85)
mainloop()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 2020-03-27
    • 1970-01-01
    • 2020-09-13
    • 2017-03-17
    • 2016-06-09
    • 2019-12-21
    • 2012-06-28
    相关资源
    最近更新 更多