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 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)