如何实现Tkinter中f(x)=标签与Entry组件并排且屏幕居中显示?
问题描述
需要将Tkinter中的“f(x)=”标签(L1)与输入框(Entry组件)并排放置,同时让它们处于屏幕中心。试过pack方法,也用了place方法——place能实现效果,但在不同屏幕尺寸的设备上会错位,没法用。现有代码如下:
from tkinter import* from matplotlib import pyplot as plt from numpy import* t = Tk() def odust(): t.destroy() return def prikaz(): x = linspace(-20, 20) plt.ylim(-20,20) plt.plot(x, eval(str(E.get())), linewidth=1, color="black") yaxis=range(-20,20) xaxis=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] plt.plot(xaxis,yaxis,linewidth=0.5,color="black") plt.plot(x,x*0,linewidth=0.5,color="black") plt.show() return t.attributes('-fullscreen', True) t.config(bg="white") xbutton = Button(t, text=" X ", bg="red", fg="white", font=("Goudy stout", 16), command=lambda:[odust()]) xbutton.pack(side="top", anchor="ne") L=Label(t, text="Upišite u sivo polje funkciju grafa\nkoji želite prikazati.\n(Nap. razlomke pišite kao (a+b)/c)\n(Kod umnoska pišite '*', npr 3*x)",bg="white", fg="black",font=("Goudy Stout", 18)) L.pack(side="top", pady=20) natrag=Button(t, text="Natrag", bg="black",fg="white", font=("Goudy stout", 16) ,command=lambda:[odust()]) natrag.pack(side="bottom", pady=20) prikazgraf=Button(t, text="Prikaži graf", fg="white", bg="black",font=("Goudy stout", 16),command=lambda:[prikaz()]) prikazgraf.pack(side="bottom",pady=20) L1 = Label(t, text="f(x)=", bg="white", fg="black", font=("Goudy Stout", 12)) L1.pack(side="left", anchor="center", pady=20) E=Entry(t, bg="gray", fg="black",font=("Goudy Stout", 12)) E.pack(side="left", anchor="center", pady=20) t.mainloop()
解决方案
用Frame容器包裹标签和输入框,再将这个Frame在主窗口居中,就能实现组件并排且自适应不同屏幕的需求。修改后的代码如下:
from tkinter import* from matplotlib import pyplot as plt from numpy import* t = Tk() def odust(): t.destroy() return def prikaz(): x = linspace(-20, 20) plt.ylim(-20,20) plt.plot(x, eval(str(E.get())), linewidth=1, color="black") yaxis=range(-20,20) xaxis=[0]*40 # 简化原xaxis的写法,效果一致 plt.plot(xaxis,yaxis,linewidth=0.5,color="black") plt.plot(x,x*0,linewidth=0.5,color="black") plt.show() return t.attributes('-fullscreen', True) t.config(bg="white") xbutton = Button(t, text=" X ", bg="red", fg="white", font=("Goudy stout", 16), command=lambda:[odust()]) xbutton.pack(side="top", anchor="ne") L=Label(t, text="Upišite u sivo polje funkciju grafa\nkoji želite prikazati.\n(Nap. razlomke pišite kao (a+b)/c)\n(Kod umnoska pišite '*', npr 3*x)",bg="white", fg="black",font=("Goudy Stout", 18)) L.pack(side="top", pady=20) natrag=Button(t, text="Natrag", bg="black",fg="white", font=("Goudy stout", 16) ,command=lambda:[odust()]) natrag.pack(side="bottom", pady=20) prikazgraf=Button(t, text="Prikaži graf", fg="white", bg="black",font=("Goudy stout", 16),command=lambda:[prikaz()]) prikazgraf.pack(side="bottom",pady=20) # 新增Frame容器,用于包裹标签和输入框 input_frame = Frame(t, bg="white") input_frame.pack(expand=True) # 让Frame在窗口中居中,自动适配屏幕 L1 = Label(input_frame, text="f(x)=", bg="white", fg="black", font=("Goudy Stout", 12)) L1.pack(side="left", padx=(0, 5)) # 标签居左,右侧留5px间距增强可读性 E=Entry(input_frame, bg="gray", fg="black",font=("Goudy Stout", 12)) E.pack(side="left") t.mainloop()
修改说明
- 新增
input_frame作为容器,将L1和E放入其中,保证两者相对位置固定。 input_frame.pack(expand=True)让Frame在主窗口中自动扩展并居中,无论屏幕尺寸如何变化,都能保持整体居中。- 标签和输入框在Frame内用
side="left"实现并排,通过padx调整间距,优化布局美观度。 - 顺便简化了原代码中
xaxis的写法,用[0]*40替代重复的0,效果一致且更简洁。
内容的提问来源于stack exchange,提问作者RapidDog65
相关产品推荐
相关产品推荐

