我正在开发一个拖放功能,它允许我在画布上移动项目。我让它工作(有点),但我只稍微移动,但线穿过屏幕(并最终离开屏幕的可见部分)画布,所以我无法到达它。我不知道从这里去哪里。下面是我到目前为止创建的拖放代码:
def onPressToMove(self, event): #get initial location of object to be moved
winX = event.x - self.workspace.canvasx(0)
winY = event.y - self.workspace.canvasy(0)
self.dragInfo["Widget"] = self.workspace.find_closest(event.x, event.y, halo = 5)[0]
self.dragInfo["xCoord"] = winX
self.dragInfo["yCoord"] = winY
def onReleaseToMove(self, event): #reset data on release
self.dragInfo["Widget"] = None
self.dragInfo["xCoord"] = 0
self.dragInfo["yCoord"] = 0
def onMovement(self, event):
winX = event.x - self.workspace.canvasx(0)
winY = event.y - self.workspace.canvasy(0)
newX = winX - self.dragInfo["xCoord"]
newY = winY - self.dragInfo["yCoord"]
self.workspace.move(self.dragInfo["Widget"], newX, newY)
Run Code Online (Sandbox Code Playgroud)
DragInfo 是我用来存储数据的字典。最初我认为将画布坐标转换为窗口坐标会有所帮助,但它的作用与没有这些东西时相同。
我正在使用 Tkinter 的 Canvas 为我的 GUI 创建简单的图形。我注意到我想将我的形状和文本放在画布的角落,但它们最终被部分隐藏。对于文本,我看到anchor文档建议设置一个选项NW,例如,如果我想将文本放在左上角,但即使如此,我也只看到文本开头的一点点被剪切离开。这是我的代码:
import Tkinter as tk
root = tk.Tk()
root.geometry("300x300")
c = tk.Canvas(root, bg="green", width=300, height=300)
c.pack(fill="both", side="right", expand=True)
c.create_text(0,0,text="Hello world!", anchor="nw")
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
我知道我可以调整文本开始位置的坐标,并通过反复试验找出哪个给出最好的结果,但我想知道是否有更聪明的方法来做到这一点。
当我尝试创建形状(例如圆形)时,我注意到类似的事情:
import Tkinter as tk
root = tk.Tk()
root.geometry("300x300")
c = tk.Canvas(root, bg="green", width=300, height=300)
c.pack(fill="both", side="right",expand=True)
c.create_oval(0,0,300,300, fill="gray")
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
对于圆,最靠近边缘的圆部分被切除。如果我拉伸并拖动窗口变大,我可以看到圆圈的最右侧和最底部,因此它们正在被绘制。我也没有看到类似于anchor圆圈的选项。
我注意到我的画布周围、画布和窗户之间的空白空间最小。我将包装选项设置为对所有面进行填充,并在有额外空间时进行扩展。我想知道这是否是问题所在。
我有一段在 python 3.4 上运行的 tkinter 代码,它是一个放置在带有垂直滚动条的画布中的大框架,但是滚动条呈灰色,并且似乎与框架的大小无关。我使用的代码本质上是:
class EntryWindow:
def __init__(self, master):
self.master = master
self.master.minsize(750, 800)
self.master.maxsize(1000, 800)
self.canvas = tk.Canvas(self.master, borderwidth=0, bg='#ffffff')
self.vsb = tk.Scrollbar(self.master)
self.master_frame = tk.Frame(self.canvas)
self.vsb.pack(side="right", fill='y')
self.canvas.pack(side='left', fill='both', expand=True)
self.canvas.create_window((0,0), window=self.master_frame, anchor='nw', tags='self.master_frame')
self.canvas.config(yscrollcommand=self.vsb.set)
self.master_frame.grid()
###build widgets and place into master_frame
...
Run Code Online (Sandbox Code Playgroud)
其中master_frame充满了使用网格几何管理器放置的约 36 个小部件,并达到约 2000 像素的垂直高度,但滚动条不起作用。
我看到一篇关于使用 ttk 滚动条的帖子,但是当我导入时我无法让它工作。我使用的输入语句是:
import tkinter as tk
import tkinter.ttk as ttk
Run Code Online (Sandbox Code Playgroud)
然后将该行替换self.vsb = tk.Scrollbar(self.master)为self.vsb = ttk.Scrollbar(self.master)但这也没有解决问题。我还尝试删除 master 上的最小/最大尺寸(这些不是最终值,我一直在使用它)。
我做错了什么吗?我觉得它可能在我设置 canvas.config() 的行中,但我阅读了文档,它似乎是正确的。明天我计划在构建框架后尝试将框架加载到画布中。
但与此同时,如果这不起作用,任何帮助都会很棒!谢谢!
w.create_rectangle(x, y, s, s, fill=(109,170,44))
Run Code Online (Sandbox Code Playgroud)
我想实现这样的目标,但是当我尝试时出现错误。我正在使用数组/列表创建几个矩形,我希望它们是这种绿色阴影,但似乎无法找到一种有效的方法。到目前为止,唯一有效的是
w.create_rectangle(x, y, s, s, fill="green")
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的阴影。非常感谢任何帮助,我觉得虽然我在这里错过了一些重要且非常简单的东西,但我已经被这个问题挂了一段时间了。
我画了一条线tkinter.Canvas,现在我想移动一端。这可能itemconfig吗,例如与?
import tkinter
tk = tkinter.Tk()
canvas = tkinter.Canvas(tk)
canvas.pack()
line = canvas.create_line(0, 0, 100, 100)
tk.mainloop()
Run Code Online (Sandbox Code Playgroud)
现在我想将行尾更改为75, 25. 有没有更好的方法来删除该行并创建一个新行?
我尝试使用以下代码绘制在tkinter中创建一行的点:
import tkinter as tk
from time import sleep
def myfunction(event):
x, y = event.x, event.y
x1 = (x+1)
y1 = (y+1)
canvas.create_line(x, y, x1, y1)
sleep(0.5)
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()
root.bind('d', myfunction)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
可以理解的是,当我按下"d"时,该程序只能说明一点.我试过在myfunction函数中使用循环,如下所示:
def myfunction(event):
x, y = event.x, event.y
x1 = (x+1)
y1 = (y+1)
for x in range(0,5):
canvas.create_line(x, y, x1, y1)
sleep(0.1)
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我尝试了很多其他解决方案,但似乎都没有.
有这个问题的解决方案吗?
有没有办法增加或减少 tkinter 画布上形状轮廓的厚度?如果是这样,我该怎么做?
这是一些可以用作示例的代码。如何改变矩形的轮廓宽度?
from tkinter import *
root = Tk()
canvas = Canvas(root, width=500, height=350)
canvas.pack()
canvas.create_rectangle(50, 50, 150, 150, fill='blue')
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我想制作一个可滚动框架,填充应用程序窗口中的整个单元格。当调整窗口大小时,框架中的小部件应保持居中。由于框架不可滚动,我使用画布并在其窗口中放置了一个框架。滚动区域与框架相关联。但是我无法使框架扩展并填充整个画布区域。
我尝试在画布中为具有整个画布宽度的框架创建一个窗口,并将窗口宽度的变化与画布配置事件相关联。不过我得到了有线结果。该框架仅占据窗口的右侧部分。当我展开窗口时,它会向左移动。我将画布涂成黄色,将框架涂成绿色,以使事物可见。谢谢你的帮助!
import tkinter as tk
class FrameWithScrollBar(tk.Frame):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.canvas = tk.Canvas(self, bg='yellow')
self.frame = tk.Frame(self.canvas, bg='green')
self.scrollbar = tk.Scrollbar(self, orient='vertical',
command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.BOTH)
self.frame.pack(fill=tk.BOTH, expand=True)
self._frame_id = self.canvas.create_window(
self.canvas.winfo_reqwidth(), 0,
anchor='n',
window=self.frame)
self.frame.bind('<Configure>', self.onFrameConfigure)
self.canvas.bind('<Configure>', self.onCanvasConfigure)
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.frame.bbox('all'))
def onCanvasConfigure(self, event):
width = event.width
self.canvas.itemconfigure(self._frame_id, width=width)
if __name__ == '__main__':
root = tk.Tk()
fws = FrameWithScrollBar(root)
buttons = list()
for i in range(5):
for j in …Run Code Online (Sandbox Code Playgroud) 目前我有一个
canvas.tag_bind(tag, "<ButtonRelease-1>", func=move_point)
Run Code Online (Sandbox Code Playgroud)
用于移动我的点的语句,该语句会删除旧点并在用户释放按钮 1 的位置创建新点。这是可行的,但感觉很卡顿,而且 Button-1 已用完,无法用于在点之间建立连接等。我尝试过使用 b1-motion 但它只会将中心移动到我第一次移动鼠标的位置。
我的问题是如何制作一个干净的动画(如 Windows 文件拖放动画)?
下面是我移动了几个点的图表图片。
我知道有.bind这个.bind_all方法,但是这两个方法都存在问题。如果您使用.bind,则仅当光标位于该框架的空白区域时它才会滚动。如果你使用.bind_all,无论你的鼠标在哪里,只要你使用鼠标滚轮,它就会滚动。有没有办法仅当光标位于某个帧时才用鼠标滚轮滚动它?
tkinter-canvas ×10
python ×9
tkinter ×9
python-3.x ×2
canvas ×1
macos ×1
mouseevent ×1
python-2.7 ×1
scrollbar ×1
tk-toolkit ×1