Nikhil Hegde
Nikhil Hegde

Reputation: 341

Buttons and Canvas - tkinter

I've a code which ideally is supposed to have a design of a keyboard of 4 rows and 16 columns. OSK

As you can see in the photo, there's one 'A' button which has gone off. It should have been in the top right. Can anyone tell me what's wrong with the code?

I know I've hard coded even the index values as an array but that's how I start off with a script. I'll change them to a combination of list/range once I get the script to work as intended. Also, if any of my comments in the code are wrong, please correct me. I'm new to tkinter.

Code:

import tkinter

def func():
    print("Clicked")

# GUI window object
top = tkinter.Tk()

# Canvas object
C = tkinter.Canvas(top, bg="black", height=312, width=778)

# Specifying the coords of the keyboard
# Coords borders:
# y => 0-74, 76-160, 162-236, 238-312
# x => 0-50, 52-102, 104-154, 156-206,
# 208-258, 260-310, 312-362, 364-414,
# 416-466, 468-518, 520-570, 572-622,
# 624-674, 676-726, 728-778
y = (312,238,236,162,160,76,74,0)
x = (0,50,52,102,104,154,156,206,208,258,260,310,312,362,364,414,416,466,468,518,520,570,572,622,624,674,676,726,728,778)
by = (285, 199, 123, 37)
bx = (25,77,129,181,233,285,337,389,441,493,545,597,649,701,753)

yi = (0,2,4,6)
xi = (0,2,4,6,8,10,12,14,16,18,20,22,24,26,28)
biy = (0,1,2,3)
bix = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14)

for indexY in yi:
    for indexX in xi:
        #print ("Xi = " + str(x[indexX]) + " Xi+1 = " + str(x[indexX+1]) + " Yi = " + str(y[indexY]) + " Yi+1 = " + str(y[indexY+1]))
        coord = x[ indexX ], y[ indexY ], x[ indexX ], y[ indexY + 1 ], x[ indexX + 1 ], y[ indexY + 1 ], x[ indexX + 1 ], y[ indexY ]
        # Create polygon object
        oval = C.create_polygon(coord, fill="white")

for indexY in biy:
    for indexX in bix:
        #print (by[indexY])
        #print (bx[indexX])
        B = tkinter.Button(top, text = 'A', command = func)
        B1 = C.create_window(bx[ indexX ] , by[ indexY ], window = B)

# Combine all canvas objects
C.pack()

# Combine all button objects
B.pack()

# Runs an infinite loop so that the resultant window doesn't disappear
# Executed only once when application is ready
top.mainloop()

Upvotes: 0

Views: 671

Answers (1)

jasonharper
jasonharper

Reputation: 9587

The problem is the line B.pack() - B at that point is a single button, the very last one you created (so your comment on that line is utterly wrong). Packing it takes it away from the control of the canvas you originally placed it in, and places it as an independent item in its parent widget.

Upvotes: 1

Related Questions