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)
这是程序和结果的图像:
如何HWND在Windows上的python3中获取Tkinter窗口的?
HWND或来执行自定义绘图操作。HDC有没有办法获取HWND或Canvas任何其他子组件?
有一种方法可以列出当前进程创建的所有窗口。我还可以迭代前面列出的任何窗口的子窗口。这将是这个问题的丑陋的解决方案。
如果 Tkinter 不直接公开句柄,请发布任何替代解决方案。
我尝试在互联网上大量搜索解决方案,但没有找到任何解决方案。我正在尝试删除画布上绘图周围的空白,如图所示,但到目前为止我还没有成功。
我写的简单代码是:
import tkinter as tk
import matplotlib
from matplotlib import style
style.use('seaborn-darkgrid')
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import random
class GUIplot(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
printButton = tk.Button(self, text="Plot1", command=lambda: self.printMessage(canvas,a))
printButton.grid(row=0, column=0, sticky='w')
f = Figure(figsize=(24,12))
a = f.add_subplot(111, axisbg='r')
canvas = FigureCanvasTkAgg(f, self)
canvas.get_tk_widget().grid(row=1, columnspan=2)
#canvas._tkcanvas.config(bg='blue')
canvas.show()
canvas.blit()
def printMessage(self,canvas,a):
a.clear()
my_random_x = random.sample(range(100),10)
my_random_y = random.sample(range(100),10)
a.plot(my_random_x,my_random_y,'*')
canvas.draw()
print("Wow")
GUIplot1 = GUIplot()
GUIplot1.title('PlotFunction')
w, h = GUIplot1.winfo_screenwidth(), GUIplot1.winfo_screenheight() …Run Code Online (Sandbox Code Playgroud) 关于我的 tkinter 画布上滚动条位置的问题。我有一个带有 3 个画布小部件的框架。感谢这篇文章的想法。我添加了一个水平滚动条,每个画布都有一个 50+ 列 500+ 行的 Pandas 数据框。负载不是很快,但这不是一个目标。
新行将添加到每个数据框的底部。这个新行需要验证。因此,与其每次都向下滚动,不如滚动条/或画布显示底部。
请参阅下面定义 3x 画布和 3x 滚动条 (x+y) 的代码。
def createBox(window):
list_ = ['df1', 'df2', 'df3'] # 3 dataframes
for i in range(3):
mybox = LabelFrame(window, padx=5, pady=4)
mybox.grid(row=i, column=0)
createWindow(mybox, list_[i], i)
def createWindow(box, lt_actual, i):
canvas = Canvas(box, borderwidth=0)
frame = Frame(canvas)
vsbY = Scrollbar(box, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsbY.set, width=1200, heigh=200)
vsbY.pack(side="right", fill="y")
vsbX = Scrollbar(box, orient="horizontal", command=canvas.xview)
canvas.configure(xscrollcommand=vsbX.set, width=1200, heigh=200)
vsbX.pack(side="bottom", fill="x")
#canvas.yview_moveto(1) - no effect …Run Code Online (Sandbox Code Playgroud) 我正在为学校开展一个游戏项目,看起来像这样:游戏方面
我创建了这样的彩色多边形:
ship = can.create_polygon(410,650,450,600,490,650 , fill= 'red' , outline='black')
ennemies = can.create_rectangle(x-r, y-r, x+r, y+r, fill='green')
Run Code Online (Sandbox Code Playgroud)
所以现在我想用自己的形象填充它们.那可能吗 ?如何 ?
我的全部代码都在这里。
使用 tkinter 的画布,我试图创建一个小游戏,让人们练习学习高音谱号上的音符。
最初显示随机音符,用户必须选择正确的音符。如果学生得到正确答案,我将无法编辑画布以显示新笔记的图像。
有人可以解释一下我的代码有什么问题吗?
while True:
randomNote = randint(0, 11)
path = noteFiles[randomNote]
correctNote = notes[randomNote]
img = Image.open(path)
tk_img = ImageTk.PhotoImage(img)
canvas.create_image(505, 200, image=tk_img)
root.mainloop()
if correctNote == noteChosen:
''' User got last note right '''
canvas.delete("all")
Run Code Online (Sandbox Code Playgroud) python tkinter python-imaging-library python-3.x tkinter-canvas
尝试创建一个基于 tkinter 的窗口,允许用户在单击按钮时创建图表,刷新图表——而不是每次添加另一个图表。所有这些都无需创建新窗口。想法是单击 -> 创建图表,再次单击 -> 在同一位置用新图表替换图表。没有额外的点击,没有额外的按钮关闭。使用 matplotlib.backends.backend_tkagg 和 FigureCanvasTkAgg。这方面的文档似乎几乎不存在。在 .get_tk_widget() 中尝试了各种属性,看看我是否可以测试它是否已经存在,获取列表等。还尝试清除画布。
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
class testme:
def __init__(self,frame1):
self.frame1=frame1
self.button=Button(self.frame1,text="DRAWME",command=self.plot)
self.button1=Button(self.frame1,text="CLEARME",command=self.clearme)
self.button.pack()
self.button1.pack()
def plot(self):
f=Figure(figsize=(5,1))
aplt=f.add_subplot(111)
aplt.plot([1,2,3,4])
self.wierdobject = FigureCanvasTkAgg(f, master=self.frame1)
self.wierdobject.get_tk_widget().pack()
self.wierdobject.draw()
def clearme(self):
self.wierdobject.get_tk_widget().pack_forget()
root=Tk()
aframe=Frame(root)
testme(aframe)
aframe.pack() #packs a frame which given testme packs frame 1 in testme
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
附加的示例代码几乎接近我的目标,但它需要一个“CLEARME”按钮(只有在“DRAWME”只单击一次时才有效。我只想要某种 if 语句来检查框架中是否已经存在 FigureCanvasTkAgg 对象,并且如果是这样,请删除它而不是单击按钮。
经过多次尝试,我得出结论,我对这里发生的不止一件事有根本的误解。
我正在尝试将某些画布的宽度设置为母版的宽度(全屏),并将高度设置为母版的 1/5、3/10 和 1/2。窗口已正确显示,但画布未出现。我尝试使用 place() 而不是 pack() 并使用 relwidth = 1 和 relheight = 0.2 失败。我只想将我的三块画布堆叠起来并水平填充窗口。
master = Tk()
master.attributes('-zoomed', True)
w = master.winfo_width()
h = master.winfo_height()
hu = int(h/10)
h1 = hu*2
h2 = hu*3
h3 = hu*5
c1 = Canvas(master, bg='grey', width = w, height = h1)
c1.pack()
c2 = Canvas(master, bg='blue', width = w, height = h2)
c2.pack()
c3 = Canvas(master, bg='red', width = w, height = h3)
c3.pack()
Run Code Online (Sandbox Code Playgroud)
编辑:我的工作代码现在是:
c1 = Canvas(master)
c1.place(rely = 0, relheight …Run Code Online (Sandbox Code Playgroud) 我正在使用 matplotlib 3.2.2 版和 tkinter 编写交互式绘图脚本。
运行脚本时,第一个窗口如下所示:
此外,一旦单击Plot figure e 按钮,rcParams 就会更新和绘制:
如果我现在点击按钮更改绘图设置并更改例如markersize参数 -> Plot figure,则绘图更新如下:
但是,如果我尝试将标签大小更改为 20 像素,然后验证 rcParams['axes.labelsize']已更改,则它们是。但是 x 和 y 标签的大小在实际绘图中永远不会更新。
绘图标题(一直到绘图窗口顶部的文本输入字段)字体大小可以在绘图后更改。
最小代码:
"""
This is a script for interactively plotting a scatterplot and changing the plot params.
"""
import numpy as np
import matplotlib as mpl
import matplotlib.style
import random
mpl.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
import matplotlib.pyplot as plt …Run Code Online (Sandbox Code Playgroud) 我试图在屏幕上显示图像,而不弹出/包含任何窗口/应用程序。我对 TKinter 非常熟悉,但删除画布背景颜色的方法很糟糕,并且会产生一些不良效果。
import tkinter as tk
import ctypes
user32 = ctypes.windll.user32
screen_size = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
root = tk.Tk()
root.overrideredirect(True)
root.config(bg="blue", bd=0, highlightthickness=0)
root.attributes("-transparentcolor", "#FEFCFD")
root.attributes("-topmost", True)
tk_img = tk.PhotoImage(file="image.png")
canvas = tk.Canvas(root, bg="#FEFCFD", bd=0, highlightthickness=0, width=screen_size[0], height=screen_size[1])
canvas.pack()
img = canvas.create_image(0, 0, image=tk_img, anchor="nw")
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
该-transparentcolor标志主要删除背景,但如果图像有任何部分透明的像素,它会给它们着色。另外,如果图像中存在该颜色,它将被删除;这种颜色的选择是希望最大限度地减少图像中的精确匹配,同时也以白色为主,希望对图像产生最不明显的影响。这是它当前的样子;非常接近我想要的,但是您可以在骰子的白色区域中看到一些丢失的像素,并且由于它们的边缘部分透明,它们周围似乎都有白色边框。这就是图像应该的样子。
我也尝试过使用 wxPython 来实现这种效果,但我无法删除窗口的背景,导致透明图像总是由某种颜色支持。我用了这个答案;我稍微修改了它,但我所做的一切都没有改善它。
那么,有没有一种方法可以用Python在屏幕上绘制完全没有背景的图像呢?
tkinter ×10
tkinter-canvas ×10
python ×9
python-3.x ×4
matplotlib ×1
pandas ×1
windows ×1
wxpython ×1