msdm3 2023-02-25 10:55 采纳率: 50%
浏览 53
已结题

python tkinter运行时grid函数直接使用不执行但是作为按钮的命令正常执行

在编写GUI的过程中,需要将一个按钮的命令单独拎出来执行,其他都正常执行但是grid却没有任何效果,这部分代码如下,重点在最后一段代码

from tkinter import *
from draggableWindow import move_window as m_w
from windowSet import windowSet
import numpy as np
import os
import time


def close_window(event): # 设置关闭窗口的程序
    from tkinter import messagebox

    if messagebox.askokcancel('退出','请确认是否退出程序'):
        root.destroy()


def _on_mousewheel(event):  # 鼠标滚轮
        canvas_main.yview_scroll(int(-1 * (event.delta / 120)), "units")


root = Tk()


sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
ww = 1280
wh = 720
x = int((sw - ww) / 2)
y = int((sh - wh) / 2)
root.title("燃烧炉监测窗口")
root.geometry(f'{ww}x{wh}+{x}+{y}')
#root.overrideredirect(True)
m_w(root)
root.bind('<Escape>',close_window) # 将close_window与Esc键绑定


savedSettings = {}

if os.path.isfile('Settings.npy'):
    savedSettings = np.load('Settings.npy',allow_pickle = True).item()


canvas_main = Canvas(root,width = ww - 21,height = wh - 33,highlightthickness = 0,bg = 'pink')
scrollbar_main = Scrollbar(root,orient = "vertical",command = canvas_main.yview)
f_main = Frame(canvas_main)
f_main.bind("<Configure>",lambda e: canvas_main.config(scrollregion = canvas_main.bbox('all')))
canvas_main.create_window((0, 0),window = f_main,anchor = "nw")
canvas_main.config(yscrollcommand = scrollbar_main.set)
canvas_main.grid(row = 0,column = 0,sticky = NW)
scrollbar_main.grid(row = 0,column = 1,sticky = NS)
canvas_main.bind_all("<MouseWheel>", _on_mousewheel)  # 绑定鼠标滚轮


btSet = Button(root,text = '设置',command = lambda: windowSet(root,savedSettings,f_main),font = ('微软雅黑',10))
btSet.place(relx=1,rely=1,anchor = SE)


if savedSettings != {}:
    widgt_c = 0

    for i in range(4):

        if savedSettings[f"CheckVar{1 + i}"] == 1:
            widgt_c += 1

        if savedSettings[f"CheckVar{1 + i}"] == 1:
            widgt_c += savedSettings['customizeWidgt_n']

    for i in range(widgt_c):
        print(1)
        globals()[f"f_{1 + i}"] = Frame(f_main,width = (root.winfo_width() - 21) / 3,height = (root.winfo_height() - 33) / 3,bg = 'blue')
        globals()[f"f_{1 + i}"].grid(row = int(i / 3),column = i % 3,sticky = NW)
        globals()[f"f_{1 + i}"].grid_propagate(False)


root.mainloop()

运行结果如下

img

img

img

通过按钮执行的效果如下

img


第一张图中的4个1证明这段代码正确的被运行了但是f_1,2,3,4却没有在窗口中
这是出现了什么问题呢?也没有报错

  • 写回答

5条回答 默认 最新

  • 「已注销」 2023-02-25 12:18
    关注

    参考GPT和自己的思路,在代码中,globals()[f"f_{1 + i}"] 会动态创建变量名为 f_{1 + i} 的变量,但是在最后的代码中使用 f_{1 + i} 来引用这些变量,这是不正确的,应该使用 globals()[f"f_{1 + i}"] 来引用这些变量。

    修改后的代码如下:

    if savedSettings != {}:
        widgt_c = 0
    
        for i in range(4):
    
            if savedSettings[f"CheckVar{1 + i}"] == 1:
                widgt_c += 1
    
            if savedSettings[f"CheckVar{1 + i}"] == 1:
                widgt_c += savedSettings['customizeWidgt_n']
    
        for i in range(widgt_c):
            print(1)
            frame = Frame(f_main, width=(root.winfo_width() - 21) / 3, height=(root.winfo_height() - 33) / 3, bg='blue')
            globals()[f"f_{1 + i}"] = frame
            frame.grid(row=int(i / 3), column=i % 3, sticky=NW)
            frame.grid_propagate(False)
    

    在这个修改后的代码中,我们在创建每个 frame 的时候,使用一个变量名为 frame 的变量引用它,然后使用 globals() 函数来动态创建变量名为 f_{1 + i} 的变量,并将 frame 赋值给这个变量。然后,我们在 grid 函数中使用 frame 来引用这些变量。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月5日
  • 已采纳回答 2月25日
  • 创建了问题 2月25日

悬赏问题

  • ¥15 tensorrt 推理 yolov8框出现错误
  • ¥15 用hc 05,做蓝牙控制小车 小车只能说初始遥控方向影响,后续不能更改
  • ¥15 51单片机怎么把每次输入键值保存到数组作为我的确认键的判断条件呢
  • ¥45 easy photo不能使用,求帮助
  • ¥15 c语言字符串单词入门问题报错
  • ¥30 我现在是双非人工智能专业不知道要不要转到软件工程专业
  • ¥15 请问12脉波整流机组的外特性曲线具体是如何推导
  • ¥15 abaqus里的python算法
  • ¥100 如何在思科模拟器中进入CEF模式
  • ¥15 Simulink 仿真如何使用MATLAB function模块获取到仿真过程中某一仿真时刻输入到模块的函数的值?