无法在tkinter中使用pack几何管理器

1 投票
1 回答
1624 浏览
提问于 2025-06-18 04:09

我刚开始学习tkinter(一个用来做图形界面的工具)。我想在我的程序里添加一张图片。但是我遇到了一个错误:不能在已经用网格布局(grid)管理的地方再用打包布局(pack)。如果我单独运行这段代码,它是可以工作的,我能看到图片,程序也能正常运行。但是如果我把图片和功能一起运行,就不行了。请问我该怎么解决这个问题呢?

from tkinter import *
from PIL import ImageTk,Image
import tkinter as tk
from functools import partial
root=tk.Tk()
root.geometry("900x900+100+200")
root.title("Converter")
root.configure(background="grey")
root.resizable(width=False,height=False)
lenghtVal="Lenght"
def store_lenght(sel_lenght):
  global lenghtVal
  lenghtVal=sel_lenght
def call_result(rL,inputn):
 lenght=inputn.get()
 if lenghtVal=="Angström-Milimetre":
    mm=float((float(lenght)*10**-7))
    rL.config(text="% f milimetre" % mm)

 if lenghtVal=="Yard-Metre":
    m=float((float(lenght)*0.9144))
    rL.config(text="% f metre" % m)


 if lenghtVal=="Inch-Metre":      
    m=float((float(lenght)*0.0254))
    rL.config(text="% f metre" % m)

 if lenghtVal=="Mil-Metre":
    km=float((float(lenght)*1.6903))
    rL.config(text="% f kilometre" % km)
 return
numberInput=tk.StringVar()
var=tk.StringVar()
input_label=tk.Label(root,text="Enter",background="white",foreground="black")
input_entry=tk.Entry(root,textvariable=numberInput)
input_label.grid(row=0)
input_entry.grid(row=0,column=1)
rLabel=tk.Label(root,text="0.0",background="white")
rLabel.grid(row=4,columnspan=2)
call_result=partial(call_result,rLabel,numberInput)

result_button=tk.Button(root,text="convert",command=call_result,background="white",foreground="black")
result_button.grid(row=2,columnspan=2)
dropdownList=["-Uzunluk Ölçüleri-","Angström-Milimetre","Yard-Metre","Inch-Kilometre","Mil-Metre"]
dropdown=tk.OptionMenu(root,var,*dropdownList,command=store_lenght)
dropdown.grid(row=0,column=2)
var.set(dropdownList[0])

root=Tk()

root.geometry("1255x944")
image=Image.open("C:\\Users\\Asus\\Desktop\\6.png")
photo=ImageTk.PhotoImage(image)
label=Label(image=photo)
label.pack()
root.mainloop()

相关问题:

  • 暂无相关问题
暂无标签

1 个回答

1

在tkinter中,.grid().pack()不能在同一个窗口里一起使用。要解决这个问题,你需要选择只用.grid或者.pack()其中一个。

在你代码的最后部分,你写了label.pack()。其实,你应该用label.grid(row=5),或者根据你想放置标签的位置来调整。

如果你真的想同时使用这两种方法,可以把所有使用.grid()的控件放到一个Frame控件里。然后,你就可以把这两个Frame都用.pack()放进去。

撰写回答