![](/img/trans.png)
[英]How to place a widget in a specific position relative to the button clicked. (Tkinter)
[英]Tkinter place widget in specific location relative to window resize
我是tkinter和python的新手,我只想在特定位置的画布上(带有背景图像)放置“文本输入”小部件和“按钮”小部件,并使整个布局相对于窗口的大小。这是因为我会将gui设置为在不同的显示器上全屏显示,例如,从宽屏到4:3的宽高比。但是我希望我的按钮和小部件保持相对位置,此图说明了什么我的意思是: -https : //i.imgur.com/IMBuwkQ.png
不幸的是,我在使用pack和grid选项给我这个相对于Windows /屏幕尺寸的精确位置方面没有任何运气。是否有代码可以运行以返回我想要的位置,所以我可以在grid /中输入打包以放置我的小部件?
因此,我开发了一些简单的python3代码来尝试完成此操作并具有以下功能:-(为方便起见,图像参考是在线的,因此该代码应立即运行,而不会在您选择的IDE中产生任何障碍)
from tkinter import*
from PIL import ImageTk, Image
import io
from io import BytesIO
import base64
import webbrowser
import urllib.request # not urllib.request
from PIL import Image, ImageTk
root = Tk()
root.geometry("1600x700+0+0")
url = "https://i.imgur.com/VqBbqpH.png" #use "direct link" from imgur, not "image link"
u = urllib.request.urlopen(url)
raw_data = u.read()
u.close()
im = Image.open(BytesIO(raw_data))
image = ImageTk.PhotoImage(im)
entryDefaultText="Enter Text"
class App(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.button = Button(master, text="Edit Box Details(click here)", fg="blue")
self.button.pack()
#self.button.pack().pack(side=TOP, anchor=W, fill=X, expand=NO)
self.columnconfigure(0,weight=1)
self.rowconfigure(0,weight=1)
self.original=im
self.image = ImageTk.PhotoImage(self.original)
self.display = Canvas(self, bd=0, highlightthickness=0)
self.display.create_image(0, 0, image=self.image, anchor=NW, tags="IMG")
self.display.grid(row=0, sticky=W+E+N+S)
self.pack(fill=BOTH, expand=1)
self.bind("<Configure>", self.resize)
self.entryWidget(self)
def entryWidget(self,root):
self.entry_var = entryDefaultText
v = StringVar(root, value='Enter Text')
#self.entry = Entry(root, textvariable=self.entry_var)
self.entry = Entry(root, textvariable=v)
self.entry.grid(row=0, column=0, sticky=N,padx=1, pady=1) # margins
def resize(self, event):
size = (event.width, event.height)
resized = self.original.resize(size,Image.ANTIALIAS)
self.image = ImageTk.PhotoImage(resized)
self.display.delete("IMG")
self.display.create_image(0, 0, image=self.image, anchor=NW, tags="IMG")
#in ms
app = App(root)
app.mainloop()
root.mainloop()
我设法使背景图像根据窗口大小进行调整,但是我的窗口小部件和按钮位于顶部。我尝试指定位置,例如,在这种情况下,我希望窗口小部件位于三角形的顶部顶点。我该如何指定该确切位置,以及如何使我的小部件坐在该位置的背景图片上,而不是在gui的顶部/底部/侧面。 谢谢!
我能够解决此通过更换两个(感谢Goyo) .pack
和.grid
与几何经理.place
即我加入几何经理: -
self.button.place(relwidth = 0.07, relheight = 0.03, relx = 0.489, rely = 0.243)
和
self.entry.place(relwidth=0.07, relheight=0.03, relx=0.489, rely=0.276)
这样可以让我指定放置小部件和按钮的位置,并将它们的大小与窗口的相对大小相关联。作为生活质量问题,我添加的另一件事是在gui上发布了光标的位置使用此代码(特别感谢unutbu在堆栈溢出时的回答):-
def motion(event):
x, y = event.x, event.y
print('{}, {}'.format(x, y))
#in ms
root.bind('<Motion>', motion)
root.mainloop()
这会打印我想要的位置的坐标,以便我可以正确放置按钮并编辑文本小部件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.