我有一个Tkinter Canvas小部件(Python 2.7,而不是3),在这个Canvas上我有不同的项目.如果我创建一个与旧项目重叠的新项目,它将在前面.我现在如何在旧创建的项目前面移动旧项目,或者甚至在"画布"上的所有其他项目前移动旧项目?
目前为止的示例代码:
from Tkinter import *
root = Tk()
canvas = Canvas(root,width=200,height=200,bg="white")
canvas.grid()
firstRect = canvas.create_rectangle(0,0,10,10,fill="red")
secondRect = canvas.create_rectangle(5,5,15,15,fill="blue")
Run Code Online (Sandbox Code Playgroud)
现在我希望firstRect位于secondRect之前.
我正在尝试模拟一个美国交通信号灯,在一个矩形上有3个圆圈,所有这些都是在一套Canvas上绘制的.模拟应该通过按以下顺序每2秒更改显示哪个灯来反映"动画":绿色>黄色>红色>绿色等永远.
我能想到的唯一方法是使用canvas.move(),canvas.after(),canvas.update()模式移动填充的椭圆形对象,一次叠加一个未填充的圆.我已经得到了逻辑,以适当的速度和正确的顺序移动一个圆圈.问题是,我只是实例化了一个充满"绿色"的圆圈,但我无法使用此方法将其更改为"黄色"或"红色".看看canvas.delete("填充")似乎很愚蠢,并且每隔2秒在一个新的地方重新绘制一个不同的填充,因为这对于这样一个简单的程序来说有很多工作要做.
问题1:有没有办法可以随意改变fill我填充的Canvas对象的选项,使用某种方法或其他方法?
问题2:我是否错误地接近了这种情况?有没有更好的方法来模拟这个?
我有一个Tkinter画布,其中填充了使用create_text和create_window方法创建的文本和画布窗口或小部件.我在画布上放置的小部件是文本小部件,我想在创建和放置文本后插入文本.如果可能的话,我无法弄清楚如何做到这一点.我意识到你可以在创建后使用它们编辑它们canvas.itemconfig(tagOrId, cnf),但不能以这种方式插入文本.这个问题有方法解决吗?
我一直在试图传递一些脚本(使用Tkinter的)的GUI的背后,到目前为止迄今该所打开的任何数据在Tkinter的画布显示(使用matplotlib绘制吧)做到了.
我唯一的问题是matplotlib中的标准缩放/滚动(使用鼠标左键"移动"绘图和鼠标右键"缩放")在画布中无法访问,基本上是功能matplotlib绘图窗口中的'4尖十字'.
我认为这需要创建我自己的处理程序,但我认为必须有一种方法来使用matplotlib的默认处理程序?我也看过这个问题中提到的'滚动'画布选项,但那些似乎只是改变了绘图区域的大小而不是放大/缩小数据,我也不想再添加任何按钮来操纵情节区.
我目前最简单的代码:
#! /usr/bin/env python
from Tkinter import *
import matplotlib.pyplot as plt
import matplotlib.backends.backend_tkagg as tkagg
import tkFileDialog
class App():
def __init__(self,master):
# VARIABLES
self.inputFile = ""
self.fig = plt.Figure()
self.canvas = tkagg.FigureCanvasTkAgg(self.fig, master = master)
self.canvas.get_tk_widget().pack()
self.canvas.draw()
# FRAME
frame = Frame(master)
master.title("MassyTools 0.1.1 (Alpha)")
# VARIABLE ENTRIES
# BUTTONS
# MENU
menu = Menu(root)
root.config(menu = menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="Open Input File", command = self.openFile)
calibmenu = Menu(menu)
menu.add_cascade(label="Calibrate",menu=calibmenu)
calibmenu.add_command(label="Open …Run Code Online (Sandbox Code Playgroud) 所以我有这个代码绘制一个简单的矩形:
from tkinter import *
root = Tk()
canvas = Canvas(root, width = 500, height = 500)
canvas.pack()
canvas.create_rectangle(100, 100, 400, 400, fill='black')
mainloop()
Run Code Online (Sandbox Code Playgroud)
现在我一直在寻找各处,似乎找不到改变填充颜色的方法,理想情况下我希望能够在点击时这样做.
我实际上将使用它来改变由我编写的函数生成的六边形的颜色
create_polygon()
Run Code Online (Sandbox Code Playgroud)
但我想它的工作方式与矩形相同.
我意识到代码可能需要完全重构.
canvas.create_line(50, 500, 950, 500, dash=(5, 1), tags="splitDistance")
Run Code Online (Sandbox Code Playgroud)
这将创建一条如下所示的行:
XXXXX XXXXX XXXXX XXXXX
Run Code Online (Sandbox Code Playgroud)
但当将1更改为任意值时,间隙大小不会改变。
dash=(5, 100):
XXXXX XXXXX XXXXX XXXXX
Run Code Online (Sandbox Code Playgroud)
另一个奇怪的行为是,第一个参数仅在可被 5 整除时才会更改结果,例如:(5, 10, 15, 20...)
dash=(1, 1):
X X X X X X X X X X X X
Run Code Online (Sandbox Code Playgroud)
dash=(4, 1):
X X X X X X X X X X X X
Run Code Online (Sandbox Code Playgroud)
dash=(5, 1):
XXXXX XXXXX XXXXX XXXXX
Run Code Online (Sandbox Code Playgroud)
这是程序和结果的图像:
我正在尝试使用tkinter为我的脚本获取圆形按钮。
我发现以下代码:
from tkinter import *
import tkinter as tk
class CustomButton(tk.Canvas):
def __init__(self, parent, width, height, color, command=None):
tk.Canvas.__init__(self, parent, borderwidth=1,
relief="raised", highlightthickness=0)
self.command = command
padding = 4
id = self.create_oval((padding,padding,
width+padding, height+padding), outline=color, fill=color)
(x0,y0,x1,y1) = self.bbox("all")
width = (x1-x0) + padding
height = (y1-y0) + padding
self.configure(width=width, height=height)
self.bind("<ButtonPress-1>", self._on_press)
self.bind("<ButtonRelease-1>", self._on_release)
def _on_press(self, event):
self.configure(relief="sunken")
def _on_release(self, event):
self.configure(relief="raised")
if self.command is not None:
self.command()
app = CustomButton()
app.mainloop()
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
TypeError: __init__() missing 4 required …Run Code Online (Sandbox Code Playgroud) 如何HWND在Windows上的python3中获取Tkinter窗口的?
HWND或来执行自定义绘图操作。HDC有没有办法获取HWND或Canvas任何其他子组件?
有一种方法可以列出当前进程创建的所有窗口。我还可以迭代前面列出的任何窗口的子窗口。这将是这个问题的丑陋的解决方案。
如果 Tkinter 不直接公开句柄,请发布任何替代解决方案。
我知道这一点pack,pack_forget可用于显示或隐藏小部件。哪些是画布上项目的等效命令?
注意:最好保留完整的物品信息,包括它的位置。pack/不是这种情况pack_forget,您需要在使用 pack 时再次通知位置。
我知道这canvas = tkinter.Canvas(bg='red')会创建一个背景色为红色的画布。由于背景颜色是在创建新画布时选择的,有什么方法可以稍后在程序中更改背景颜色而不创建新画布?
我能想到的最好的解决方案是创建一个大矩形,用所需的背景颜色覆盖整个屏幕,但实际的背景颜色在执行此操作后保持不变,并在清除画布时显示。
tkinter ×10
tkinter-canvas ×10
python ×9
python-3.x ×2
matplotlib ×1
text ×1
widget ×1
windows ×1