【问题标题】:how do you not print if x is the same?如果 x 相同,你怎么不打印?
【发布时间】:2021-03-29 14:55:13
【问题描述】:

我是 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()

谢谢!

【问题讨论】:

  • 您可以保留最后一个副本的实时副本(您正在使用 x 执行此操作),然后检查它们是否匹配,如果匹配则不打印到屏幕上。如果没有,则打印到屏幕并更新 x。

标签: python variables tkinter clipboard pyperclip


【解决方案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()

【讨论】:

  • 您不需要使用两次global。你可以做global x, old_x
  • true,@Mike-SMT,我倾向于不使用全局变量,所以我选择了我知道可行的东西。我同意有更好的方法来处理这个问题,但这种方法很容易理解和实施,而且很有效。
  • 好吧,只使用一个全局变量,然后在满足条件时替换该全局变量会更容易。但是是的,这确实可以正常工作。
  • 会的,但 OP 将 x 保留为全局变量,我决定不更改它,以防他有其他原因
【解决方案2】:

您可以简单地添加一个 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()

这是一个 OOP 示例。这有助于您避免使用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()

【讨论】:

  • 不,它不起作用,因为您没有定义 x?但你为什么使用:import tkinter as tk 而不是 from tkinter import *?
  • 通过导入 * 您冒着覆盖导入方法的风险。例如,如果您编写了自己的名为 Text 的函数/方法,它将覆盖从 tkinter 导入的 Text 方法。因此,通过 import as something 您可以确保您永远不会覆盖任何这些导入的名称,因为您对所有 tkinter 导入都使用了 tk. 前缀。
  • @LucaJanss 这是一个小小的疏忽。我只是添加了检查工作的部分。现已更新。
猜你喜欢
  • 2021-10-27
  • 2010-11-08
  • 2021-05-28
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 2020-05-09
相关资源
最近更新 更多