使用简单的函数每 1 秒刷新一次标签中的图像

亨利

我试图在每 1 秒后刷新标签图像我创建了一个类,其中只有一次我会点击按钮显示图像,之后,它将在每秒刷新一次,但无法完成这项工作

早些时候我试图让它与画布一起工作,但它并没有通过标签显示它来帮助我,但能够使用刷新

self.canvas.after(100, self.loopCap)

但现在在标签小部件中,我无法理解每次如何刷新标签

代码如下:

import tkinter as tk
from PIL import ImageTk, Image

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(StartPage)

    def switch_frame(self, frame_class):
        """Destroys current frame and replaces it with a new one."""
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

class StartPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, bg='powder blue')
        self.master.geometry('700x500+0+0')
        self.master.config(bg='powder blue')

        self.username = tk.StringVar()
        self.password = tk.StringVar()
        tk.Label(self, text='Sealant Login System', font=('arial', 30, 'bold'), bg='powder blue',
                              fg='black').pack(side="top", fill="x", pady=10,anchor='n')

        # =====================================================================================================

        tk.Label(self, text="UserID: ", bg='powder blue').pack(side="left", fill="x", pady=5)
        tk.Entry(self, font=('arial', 15, 'bold'), textvariable=self.username).pack(side="left", fill="x", pady=5, expand=1)
        tk.Label(self, text="Password: ", bg='powder blue').pack(side="left", fill="x", pady=5)
        tk.Entry(self, font=('arial', 15, 'bold'), textvariable=self.password).pack(side="left", fill="x", pady=5)
        tk.Button(self, text="Login",bg='cadet blue',
                  command=self.Login_System).pack(side="top",fill="y")
        tk.Button(self, text="Reset",bg='cadet blue',
                  command=self.Rest).pack(side="bottom",fill="y")
    def Login_System(self):
        u = (self.username.get())
        p = (self.password.get())

        if (u == str("admin") and p == str("admin")):
            self.master.switch_frame(PageOne)

    def Rest(self):
        self.username.set("")
        self.password.set("")
        self.master.focus()


class PageOne(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master, bg='powder blue')
        tk.Label(self, text='Sealant Reference System', font=('arial', 30, 'bold'), bg='powder blue',
                 fg='black').pack(side="top", fill="x", pady=10, anchor='n')
        tk.Label(self, text="Accuracy: ", bg='powder blue').pack(side="left", fill="x", pady=10, anchor='n')
        tk.Label(self, text="Variable", bg='powder blue').pack(side="left", fill="x", pady=10, anchor='n')
        tk.Label(self, text="No of Jobs: ", bg='powder blue').pack(side="left", fill="x", pady=10, anchor='n')
        tk.Label(self, text="Variable", bg='powder blue').pack(side="left", fill="x", pady=10, anchor='n')
        tk.Button(self, text="Return to start page",
                  command= lambda: master.switch_frame(PageTwo)).pack(side="bottom")

class PageTwo(tk.Frame):
    def loopCap(self):
        # self.label = Label(self.master, image=self.img, textvariable=self.text)
        self.img = Image.open("img.jpg")
        self.label = ImageTk.PhotoImage(self.img)
        tk.Label(self, image=self.label).pack()
        print("updated")
        self.master.after(1000, self.loopCap)

    def __init__(self, master):
        tk.Frame.__init__(self, master,bg='powder blue')
        self.master.geometry('1350x750+0+0')
        self.master.config(bg='powder blue')
        tk.Button(self, text="Return to start page",
                  command=self.loopCap).pack()
        # self.canvas.scale(master, from_=0, to=42, tickinterval=8)
        print("Load")


if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

建议将不胜感激

简单的

在里面loopCap你必须跑after()

def loopCap(self):
    # ... code ...
    self.master.after(1000, self.loopCap) # 1000ms = 1s

它会一次又一次地重复功能。

您可以使用此方法更改LabelCanvas没有区别。


如果您想使用两个按钮停止并再次启动它,那么您可以使用变量True/False- 即。self.repeate- 停止after()

def __init__(self, master):
    self.repeate = False
    tk.Button(self, text="Start", command=self.on_start)
    tk.Button(self, text="Stop",  command=self.on_stop)

def loopCap(self):
    # ... code ...
    if self.repeate:
        self.after(1000, self.loopCap)

def on_start(self):
    if self.repeated:
        print('already running')
    else:
        print('starting')
        self.repeated = True
        self.loopCap()

def on_stop(self):
    if self.repeated:
        print('stoping')
        self.repeated = False
    else:
        print('not running')

编辑:您必须在开始时创建标签,然后仅更改标签中的图像。为此,您需要两个或更多图像。

import tkinter as tk
from PIL import ImageTk, Image

class SampleApp(tk.Tk):

    def __init__(self):
        super().__init__()
        self._frame = None
        self.switch_frame(PageTwo)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)

        if self._frame is not None:
            self._frame.destroy()

        self._frame = new_frame
        self._frame.pack()

class PageTwo(tk.Frame):

    def loopCap(self):

        self.current_photo += 1
        if self.current_photo >= len(self.photo):
            self.current_photo = 0

        self.label['image'] = self.photo[self.current_photo]

        print("updated")

        self.master.after(1000, self.loopCap)


    def __init__(self, master):
        super().__init__(master, bg='powder blue')

        self.master.geometry('1350x750+0+0')
        self.master.config(bg='powder blue')

        b = tk.Button(self, text="Start", command=self.loopCap)
        b.pack()

        self.img = [
            Image.open("image1.jpg"),
            Image.open("image2.jpg"),
            Image.open("image3.jpg"),
        ]

        self.photo = [
            ImageTk.PhotoImage(self.img[0]),
            ImageTk.PhotoImage(self.img[1]),
            ImageTk.PhotoImage(self.img[2]),
        ]

        self.current_photo = 1

        self.label = tk.Label(self)
        self.label.pack()

        print("Load")

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

编辑:对于始终从文件加载的单个图像

class PageTwo(tk.Frame):

    def loopCap(self):

        self.img = Image.open("image.jpg")
        self.photo = ImageTk.PhotoImage(self.img)

        self.label['image'] = self.photo

        print("updated")

        self.master.after(1000, self.loopCap)


    def __init__(self, master):
        super().__init__(master, bg='powder blue')

        self.master.geometry('1350x750+0+0')
        self.master.config(bg='powder blue')

        b = tk.Button(self, text="Start", command=self.loopCap)
        b.pack()

        self.label = tk.Label(self)
        self.label.pack()

        print("Load")

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

每 1 秒更新一次片段中的 textview

QML TableView 实时刷新仅每 1 秒更新一次 UI

每 1 秒刷新一次 RecyclerView 适配器

从文本栏中定义的值中设置每 0.5 秒刷新一次图像链接

每 1 秒获取一次 javascript

如何每 1 秒单击一次按钮?

我如何每1秒运行一次setState函数

我想使用计时器在 winform 中每 1 秒更改一次背景色

当大约每1秒添加一次新的div时,如何使用Python从Selenium中的div中提取文本?

每x秒刷新一次数据后无法动态更新图标图像

如何使用ajax和jquery每1秒检索一次php结果

我想每1秒获取一次CPU使用率(所有核心)

如何使用ESP8266每1秒进行一次API调用?

使用Node,Express(和Socket.io?)每1秒更新一次页面

如何使用 RxJava 每 1 秒重新检查一次?

React-Native:每 X 秒解析一次简单的 JSON GET/POST 和刷新

每20秒刷新一次反应组件

AJAX jQuery每5秒刷新一次div

每5秒钟刷新一次Fancybox

每5秒自动刷新一次Updatepanel

每3秒刷新一次功能

从00:x0之前的1秒开始每10分钟运行一次Azure函数

如何在Android中每10秒刷新一次视频视图?

如何每三秒检查一次计划任务,并使用C#在标签中打印秒

在jQuery中每5秒调用一次函数的最简单方法是什么?

如何每 1 分钟刷新一次由 DataProvider 填充的 DataGrid

例如,如何每5秒更改一次图像?

如何每n秒更改一次图像

每确定秒捕获一次图像