Python Forum
Using Tkinter inside function not working
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Using Tkinter inside function not working
#1
Hello all,

With the help of some users in different forums I have get this far, but facing a new challenge in my way to making my first real world GUI, I hope some expert in tkinter can help. Needless to say that I am a novice in Python...

I have made a device with the following structure:
  • Presence sensors and controllers for Arduino
    Arduino Mega
    Raspberry Pi4
    Video card
    1280x800 OEM screen

What the system should do is: the Arduino is running a firmware to read the presence sensors and determine a position with a set of coordinates (x;y) and prints them through the Serial port (USB) in a line. The Raspberry running my Python code gets the information from the Serial port and breaks the line into 2 coordinates again. Then the program is supposed to paint a red rectangle if the coordinates are within the area defined, corresponding to 4 areas in the background image of the GUI.

I am using Tkinter for this as it looked pretty easy for me to make the main window, put a background image and paint rectangles, but the reality is that I am finding that when I run the functions of painting the rectangles it looks like Tkinter “is not present” somehow (sorry for my lack of knowledge in explaining the issue).

The code is this (and the error below):

from serial import *
from tkinter import *
import time

root = Tk() 
root.geometry("1280x800")
root.attributes('-fullscreen',True)
bg = PhotoImage(file = "/home/pi/Pictures/SCREEN2.png") 

canvas = Canvas( root, width = 1280, height = 800) 
canvas.pack(fill = "both", expand = True) 
canvas.create_image( 0, 0, image = bg, anchor = "nw") 
    
serialPort = "/dev/ttyUSB0"
ser = Serial(serialPort, 9600, timeout=0)
ser.flush()

def split_coords(astring):
    a, b = astring.split(';')
    a = int(a)
    b = int(b)
    
    return (a, b)

def paintRectangle1():
    canvas.create_rectangle(200, 120, 400, 220, fill='red')
    time.sleep(0.3)
    
def paintRectangle2():
    canvas.create_rectangle(600, 120, 800, 220, fill='red')
    time.sleep(0.3)
    
def paintRectangle3():
    canvas.create_rectangle(200, 260, 400, 360, fill='red')
    time.sleep(0.3)
    
def paintRectangle4():
    canvas.create_rectangle(600, 260, 800, 360, fill='red')
    time.sleep(0.3)

root.mainloop() 

while True:
        
    if ser.in_waiting> 0:
        line = ser.readline().decode('utf-8').rstrip()
        x, y = split_coords(line)
        print("x:", x, "- y:", y)
        
        if (19 < x < 60) and (20 < y < 40):
            print("OK button1")
            paintRectangle1()
        if (68 < x < 110) and (20< y < 40):
            print("OK button2")
            paintRectangle2()
        if (19 < x < 60) and (45 < y < 80):
            print("OK button3")
            paintRectangle3()
        if (68 < x <110) and (45 < y < 80):
            print("OK button4")
            paintRectangle4()
            
        #else:
            #paint the backgrand image again after the 0.3 seconds defined into the paintRectangle function
The error that this code throws:

Error:
x: 32 - y: 28 OK button1 Traceback (most recent call last): File "/home/pi/Documents/Touch-GUI-TKInter_4.py", line 52, in <module> paintRectangle1() File "/home/pi/Documents/Touch-GUI-TKInter_4.py", line 26, in paintRectangle1 canvas.create_rectangle(200, 120, 400, 220, fill='red') File "/usr/lib/python3.7/tkinter/__init__.py", line 2501, in create_rectangle return self._create('rectangle', args, kw) File "/usr/lib/python3.7/tkinter/__init__.py", line 2480, in _create *(args + self._options(cnf, kw)))) _tkinter.TclError: invalid command name ".!canvas"
As can be seen, the program goes into the paintRectangle after reading the coordinates, but it does not "understand" the canvas operation.

I really don’t know what I should do to “get the mainframe inside the def statements” to make this work.

Does anyone have an idea of what I am doing wrong? Wall

Thanks in advance.

Joan.
Reply


Messages In This Thread
Using Tkinter inside function not working - by Ensaimadeta - Dec-22-2020, 08:52 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  tkinter destroy label inside labelFrame Nick_tkinter 3 4,561 Sep-17-2023, 03:38 PM
Last Post: munirashraf9821
  [Tkinter] Help running a loop inside a tkinter frame Konstantin23 3 1,586 Aug-10-2023, 11:41 AM
Last Post: Konstantin23
  Tkinter won't run my simple function AthertonH 6 3,887 May-03-2022, 02:33 PM
Last Post: deanhystad
  tkinter toggle buttons not working Nu2Python 26 7,024 Jan-23-2022, 06:49 PM
Last Post: Nu2Python
  [Tkinter] tkinter best way to pass parameters to a function Pedroski55 3 4,885 Nov-17-2021, 03:21 AM
Last Post: deanhystad
  Creating a function interrupt button tkinter AnotherSam 2 5,560 Oct-07-2021, 02:56 PM
Last Post: AnotherSam
  [Tkinter] Have tkinter button toggle on and off a continuously running function AnotherSam 5 5,028 Oct-01-2021, 05:00 PM
Last Post: Yoriz
  [Tkinter] Redirecting all print statements from all functions inside a class to Tkinter Anan 1 2,657 Apr-24-2021, 08:57 AM
Last Post: ndc85430
  tkinter get function finndude 2 2,963 Mar-02-2021, 03:53 PM
Last Post: finndude
  tkinter -- after() method and return from function -- (python 3) Nick_tkinter 12 7,450 Feb-20-2021, 10:26 PM
Last Post: Nick_tkinter

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020