当前位置: 首页 > 面试题库 >

为什么这些Python tkinter检查按钮链接在一起?

齐意致
2023-03-14
问题内容

我目前正在尝试创建一个GUI,以比较两个不同文件夹之间的文件,并且具有一个我现在正在尝试构建的基本框架。

我在窗口的左侧,右侧和底部有三个框架,每个框架都有两个复选框。我希望能够彼此独立地选择每个复选框,但是每次单击任何一个框架的第一个复选框时,其他框架的第一个复选框也会同时选择/取消选择。

为什么会这样,如何使它们彼此独立工作?这是我的代码供参考:

from tkinter import *

root = Tk()

leftFrame = Frame(root, bg = "#4d94ff")
leftFrame.pack(side = LEFT, fill = BOTH)

rightFrame = Frame(root, bg = "#ff4d4d")
rightFrame.pack(side = RIGHT, fill = BOTH)

bottomFrame = Frame(root, bg = "#5cd65c")
bottomFrame.pack(side = BOTTOM)

check_L1 = Checkbutton(leftFrame, text = "C1", bg = "#4d94ff")
check_L2 = Checkbutton(leftFrame, text = "C2", bg = "#4d94ff")

check_R1 = Checkbutton(rightFrame, text = "C1", bg = "#ff4d4d")
check_R2 = Checkbutton(rightFrame, text = "C2", bg = "#ff4d4d")

checktype1 = Checkbutton(bottomFrame, text = "Check Type 1", bg = "#5cd65c")
checktype2 = Checkbutton(bottomFrame, text = "Check Type 2", bg = "#5cd65c")

check_L1.grid(row = 0)
check_L2.grid(row = 0, column = 1)
check_R1.grid(row = 0)
check_R2.grid(row = 0, column = 1)
checktype1.grid(row = 0)
checktype2.grid(row = 1)


root.mainloop()

问题答案:

TL; DR

您需要为variable每个复选框指定一个唯一。

var_L1 = tk.IntVar()
var_R1 = tk.IntVar()
...
check_L1 = Checkbutton(..., variable=var_L1)
check_R1 = Checkbutton(..., variable=var_R1)
...

怎么了

复选按钮需要与变量关联。您没有显式设置变量,因此tkinter会创建默认值。Tkinter通过创建以复选按钮名称命名的内部变量来实现此目的。

当您创建窗口小部件并且不给它们命名时,tkinter将选择默认名称。全名包括整个窗口小部件层次结构的名称。因此,举例来说,内部名称check_L1.!frame.!checkbutton',对于名称check_R1.!frame2.!checkbutton,而对于内部名称checktype1'.!frame3.!checkbutton'

当tkinter为复选按钮创建默认变量时,它仅使用变量全名的最后一部分。因此,为此check_L1创建了一个名为的内部变量!checkbutton。的内部变量check_R1!checkbutton与的内部变量相同checktype2

因为所有这些检查按钮共享相同的内部变量,所以它们被链接了。

注意:如果要在循环中创建许多复选框,则可以将对每个复选框的引用保存到数组中。例如:

vars = []
for i in range(x):
    vars.append[tk.IntVar())
...
check_L1 = Checkbutton(..., variable=vars[0])
...
print(f"the value of L1 is {vars[0].get()}")


 类似资料:
  • 在我们的应用程序中,appium iOS无法检查一个自定义按钮。 有问题的按钮有一个Id。我们可以通过Xcode可访问性检查器检查它,但无法通过appium web检查器检查它。 此外,我们试图用从Xcode可访问性检查器获取的id单击该按钮,但它不起作用。Appium控制台搜索它,直到它超时。 如何做到这一点?因为这对我们来说是一个阻碍因素。有什么建议吗? XCode版本:9.2 MacOSx:

  • 问题内容: 方法链接 是对象方法返回对象本身以使结果被另一个方法调用的实践。像这样: 这似乎被认为是一种好习惯,因为它会产生可读的代码或“流畅的界面”。但是,对我而言,它似乎打破了面向对象本身所隐含的对象调用表示法-生成的代码不代表对先前方法的结果执行的动作,通常这是面向对象的代码的工作方式: 这种差异设法为“调用结果对象”的点标记创建了两种不同的含义:在链接的上下文中,以上示例将被视为保存参与者

  • 在任何浏览器下,默认的链接都太过平淡,不能满足大多数人的需求。尤其是希望有特大点击区域的链接,比如制作主导航链接、手风琴菜单、按钮等链接时,默认的链接更是无能为力,而按钮式链接便可担此重任。 链接默认是行内元素,只能通过链接文本来激活链接。要想让链接像按钮一样,较大的点击区域,其实很简单。只需为链接添加合适的内边距,并设置类似按钮的背景和边框即可。 a  {     padding: 10px

  • 因此,我使用javafx创建了这个应用程序,它有一个登录屏幕,但我在这方面没有任何成功,我已经在这个项目的这个小部分工作了一些天,它根本不能以任何方式工作。我尝试这样做,我看了一些教程,其中大部分都是像下面的代码一样,但它对我来说不起作用,如果有人能帮我解释为什么我的标签文本没有改变(这就是我如何测试登录是否成功),这将是很好的,下面是代码: 控制器: FXML格式

  • 问题内容: 我正在浏览我最喜欢的网站的html … ahem …,并且在标记中看到了这一点: “?d = 20090107”做什么?我假设它是某种日期,但是我不确定为什么它在文件路径中。有任何想法吗? 问题答案: 这样做是为了给文件名添加一些唯一性,以便当他们更改CSS文件时,他们可以更改额外的位,以完全确保每个客户端都将重新加载CSS,而不是使用缓存版本。 网络服务器将忽略该参数,并正常服务/C

  • 不过,我可以在01:00的视频中复制问题。这意味着当我安装带有身份验证的Laravel时,如果我在登录表单中单击提交按钮两次,Firefox将发送2个请求。 为什么在多次单击按钮时,Firefox有时发送多个请求,而有时只发送一个? 我有一个用户表 如果我在按钮上单击两次(或二十次)提交表单,那么数据库中只有一个新行。 为什么会这样?我希望,如果我多次单击submit按钮,那么表单将发送多个请求,

  • 问题内容: 这是一个程序,可将数据从T恤衫网站上抓取,然后将产品信息写入CSV文件。 有3个刮擦功能和1个写入功能。 现在,我正面临一场绝对的噩梦,试图在没有任何第三方库或软件包的情况下实现如何在这里实现承诺。仅凭ES6的本机功能可以做到吗? 由于请求的异步性质,我需要每个函数及其请求在调用下一个函数之前完全完成。这样,我就可以使用下一个函数中的变量。 我怎么能简单地做到这一点而无需重写我的整个代

  • 我试图建立一个国际象棋游戏在Python使用tkinter的图形。我创建了一个8x8(行和列)的网格,并将瓷砖放在那里(这是一种按钮)。这一切都很好,直到你用棋子填满整行,然后整行消失。我不知道为什么。 当填充整行时,除了一个:https://gyazo.com/865aed481e4a84c5e9e8918695410006 填充整行时:https://gyazo.com/acf48c97903