如果 x 相同,你如何不打印?

时间:2021-03-29 14:55:13

标签: python variables tkinter clipboard pyperclip

我是 Python 的新手。我想创建一个程序,当您将某些内容复制到剪贴板时,它会在“应用程序”上“打印”它。它可以工作,但问题是每两秒钟它就会显示您可能在 2 小时前复制的内容。我希望当剪贴板相同时,它只显示一次,然后等待您复制其他内容。 这是我目前所拥有的

import pyperclip
from tkinter import *

r = Tk()
def aper():
    global x
    x = pyperclip.waitForPaste()
    Label(r, text = x).pack()
    r.after(2000, aper)
    
r.after(2000, aper)
r.mainloop()

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以创建一个名为 old_x 的变量,将 x 的最后一个值存储在其中,并在 Label 行周围放置一个 if 语句,以便仅在 x 不是 old_x 时才打印

import pyperclip
from tkinter import *

r = Tk()
def aper():
    global x
    global old_x
    x = pyperclip.waitForPaste()
    if x != old_x:
        Label(r, text = x).pack()
        old_x = x
    r.after(2000, aper)

old_x = None
r.after(2000, aper)
r.mainloop()

答案 1 :(得分:1)

您可以简单地添加一个 IF 语句来检查 x 的旧值,然后在需要时进行更新。

也就是说,我将您的 tkinter 导入替换为 import tkinter as tk。这将有助于防止覆盖任何导入的内容。只是很好的做法。

这是一个非 OOP 示例。

import tkinter as tk
import pyperclip


r = tk.Tk()
x = ''

def aper():
    global x
    y = pyperclip.waitForPaste()
    if x != y:
        x = y
        tk.Label(r, text=x).pack()
    r.after(2000, aper)


r.after(2000, aper)
r.mainloop()

这是一个面向对象的例子。这有助于您避免使用 global。一般来说,最好避免全局。如果您想了解更多信息,这里有一些关于此的好帖子。

import tkinter as tk
import pyperclip


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.x = ''
        print('t')

    def aper(self):
        y = pyperclip.waitForPaste()
        if self.x != y:
            self.x = y
            tk.Label(self, text=self.x).pack()

        self.after(2000, self.aper)


if __name__ == '__main__':
    App().mainloop()