在投票计划中捕获的可靠按钮按下

时间:2018-04-22 22:13:48

标签: python tkinter mouse polling

我是新手(抱歉......但提前谢谢)

我已经在周末阅读问题并在很多地方查看示例,以至于我已经忘记了。

我正在构建一个从各种来源读取I / O的轮询程序 在我进行轮询时,我需要用户能够在返回此处之前单击屏幕的一部分以执行操作或转到另一个GUI页面一段时间。如果他离开此页面,我可以暂停此根页面所需的轮询。

我的问题是我无法从绑定中获得可靠的鼠标点击或鼠标位置。我已经减少了大部分代码以获得如下所示的基础知识。我完全不知道如何实现这一点,这应该是一个典型的用例?

from tkinter import *

## Set the key variables
myTanks = [20, 30, 50, 80]
activeTanks = len(myTanks)

## Functions Defined Below
def motion(event):
  print("(%s %s)" % (event.x, event.y))

def click(event):
  print("clicked")  

def readTankLevels(activeTanks):
    global myTanks
    print (myTanks)
    for i in range(0,activeTanks):
        print("Reading Tank ", str(i))
        ##  I inserted the following line to emulate the network activity and processing in the real program
        root.after(500, print("Waiting "+str(i)))

def drawTank():
    print("Drawing the Tanks in GUI")

def updateLabels():
    print("Updating the tank labels")
    t1Holder=Canvas(root, width=(100), height=50, bg="black", highlightbackground="black")
    t1Holder.bind('<Button-1>',motion)
    t1Holder.grid(row=0, column=0, padx=5, pady=0)

    t2Holder=Canvas(root, width=(50), height=75, bg="blue", highlightbackground="black")
    t2Holder.bind('<Motion>',motion)
    t2Holder.grid(row=0, column=1, padx=5, pady=0)

##  Open GUI
root = Tk() 
root.wm_title("Tank Monitor") 
root.config(width=300, height=200, padx=0, pady=0, background = "black")

##  Body of program
while True:
    ## Continuous poll of the tanks being monitored
    readTankLevels(activeTanks)
    drawTank
    updateLabels()
    root.update()

print ("You should never get here!")   

mainloop()

1 个答案:

答案 0 :(得分:0)

我最后通过实验了解'之后'是如何工作的,并希望为其他必须有类似问题的人发布答案。

'After'命令将函数调用放在要做的事情的队列中,并在时间戳上显示时间。
在那个过渡时期过后,解释器基本上坐在mainloop()命令中(在我的情况下,我是通过设计与在此期间运行其他代码来实现的)。 通过这种方式,解释器可以非常快速地为所有鼠标移动和按钮按下提供服务 我现在能够拥有一个真正有效的GUI。我无法在任何地方找到这个特定的答案,因为大多数帖子只是说在Tkinter下使用它而不是睡眠,但是没有提供它实际上做的细节。

请注意,在调用函数的循环中重新建立'after'命令很重要。在我的情况下,我想每10秒读取一次传感器,因此mainloop()之前的行是after命令,而在def中,我复制相同的代码行以每10秒调用一次'after'。 (显示为2秒以下,以使演示更快)。这应该可以帮助我在船上的任何人...

from tkinter import *

root = Tk() #Makes the window
root.wm_title("Remote Sensor Dashboard")

## initialize variables

## def's piled in form many functions below

def readSensors():  ## Get sensor data from web connected devices
    print("sensors have been read")
    updateGUI()
    root.after(2000, readSensors)

def updateGUI(): ## redraw each affected frame or canvase
    print("GUI has been updated")

def updateMousePosition(event):  ## Print the coordinates of the mouse (can also bind to clicks)
    print("(%s %s)" % (event.x, event.y))


#Create window that has your mouse targets (use buttons, color wheels etc)
mouseHouse = Frame(root, width=200, height = 200, bg="black")
mouseHouse.bind('<Motion>',updateMousePosition)
mouseHouse.grid()

## Initial Read of Sensor Network
root.after(2000, readSensors)

## Peform Initial GUI draw with the Sensor Data
print ("GUI has been drawn")

mainloop()