![](/img/trans.png)
[英]Multiple Frames, Multiple Buttons and Labels with changing image, Tkinter
[英]An easier way to place multiple Tkinter buttons/labels?
這是我的代碼,我想知道是否有更有效的方法來編寫這個網格
from tkinter import *
def btnClickFunction():
print('clicked')
main = Tk()
main.geometry('745x435')
main.title('m')
Button(main, text='O', command=btnClickFunction).place(x=80, y=110)
Button(main, text='O', command=btnClickFunction).place(x=80, y=140)
Button(main, text='O', command=btnClickFunction).place(x=80, y=170)
Button(main, text='O', command=btnClickFunction).place(x=80, y=200)
Button(main, text='O', command=btnClickFunction).place(x=80, y=230)
Button(main, text='O', command=btnClickFunction).place(x=80, y=260)
Button(main, text='O', command=btnClickFunction).place(x=80, y=290)
Button(main, text='O', command=btnClickFunction).place(x=105, y=110)
Button(main, text='O', command=btnClickFunction).place(x=105, y=140)
Button(main, text='O', command=btnClickFunction).place(x=105, y=170)
Button(main, text='O', command=btnClickFunction).place(x=105, y=200)
Button(main, text='O', command=btnClickFunction).place(x=105, y=230)
Button(main, text='O', command=btnClickFunction).place(x=105, y=260)
Button(main, text='O', command=btnClickFunction).place(x=105, y=290)
Button(main, text='O', command=btnClickFunction).place(x=130, y=110)
Button(main, text='O', command=btnClickFunction).place(x=130, y=140)
Button(main, text='O', command=btnClickFunction).place(x=130, y=170)
Button(main, text='O', command=btnClickFunction).place(x=130, y=200)
Button(main, text='O', command=btnClickFunction).place(x=130, y=230)
Button(main, text='O', command=btnClickFunction).place(x=130, y=260)
Button(main, text='O', command=btnClickFunction).place(x=130, y=290)
Button(main, text='O', command=btnClickFunction).place(x=155, y=110)
Button(main, text='O', command=btnClickFunction).place(x=155, y=140)
Button(main, text='O', command=btnClickFunction).place(x=155, y=170)
Button(main, text='O', command=btnClickFunction).place(x=155, y=200)
Button(main, text='O', command=btnClickFunction).place(x=155, y=230)
Button(main, text='O', command=btnClickFunction).place(x=155, y=260)
Button(main, text='O', command=btnClickFunction).place(x=155, y=290)
Button(main, text='O', command=btnClickFunction).place(x=180, y=110)
Button(main, text='O', command=btnClickFunction).place(x=180, y=140)
Button(main, text='O', command=btnClickFunction).place(x=180, y=170)
Button(main, text='O', command=btnClickFunction).place(x=180, y=200)
Button(main, text='O', command=btnClickFunction).place(x=180, y=230)
Button(main, text='O', command=btnClickFunction).place(x=180, y=260)
Button(main, text='O', command=btnClickFunction).place(x=180, y=290)
Button(main, text='O', command=btnClickFunction).place(x=205, y=110)
Button(main, text='O', command=btnClickFunction).place(x=205, y=140)
Button(main, text='O', command=btnClickFunction).place(x=205, y=170)
Button(main, text='O', command=btnClickFunction).place(x=205, y=200)
Button(main, text='O', command=btnClickFunction).place(x=205, y=230)
Button(main, text='O', command=btnClickFunction).place(x=205, y=260)
Button(main, text='O', command=btnClickFunction).place(x=205, y=290)
Button(main, text='O', command=btnClickFunction).place(x=230, y=110)
Button(main, text='O', command=btnClickFunction).place(x=230, y=140)
Button(main, text='O', command=btnClickFunction).place(x=230, y=170)
Button(main, text='O', command=btnClickFunction).place(x=230, y=200)
Button(main, text='O', command=btnClickFunction).place(x=230, y=230)
Button(main, text='O', command=btnClickFunction).place(x=230, y=260)
Button(main, text='O', command=btnClickFunction).place(x=230, y=290)
Label(main, text='1').place(x=50, y=110)
Label(main, text='2').place(x=50, y=140)
Label(main, text='3').place(x=50, y=170)
Label(main, text='4').place(x=50, y=200)
Label(main, text='5').place(x=50, y=230)
Label(main, text='6').place(x=50, y=260)
Label(main, text='7').place(x=50, y=290)
Label(main, text='1').place(x=80, y=80)
Label(main, text='2').place(x=105, y=80)
Label(main, text='3').place(x=130, y=80)
Label(main, text='4').place(x=155, y=80)
Label(main, text='5').place(x=180, y=80)
Label(main, text='6').place(x=205, y=80)
Label(main, text='7').place(x=230, y=80)
main.mainloop()
這最好用嵌套for
循環和grid
幾何管理器來處理。 請注意我還如何將標簽偏移一行/一列,因此網格 (0, 0) 處沒有任何內容
import tkinter as tk # it's best to avoid star imports!
# FYI: this should be 'btn_click_function' per Python style convention
def btn_click_function():
print('clicked')
main = tk.Tk()
main.geometry('745x435')
main.title('m')
for row in range(7):
# row label
r_lbl = tk.Label(main, text=row + 1) # +1 to start numbering at 1 instead of 0
r_lbl.grid(row=row + 1, column=0)
for column in range(7):
# column label
c_lbl = tk.Label(main, text=column + 1) # +1 to start numbering at 1...
c_lbl.grid(row=0, column=column + 1)
# button
btn = tk.Button(main, command=btn_click_function, text='O')
btn.grid(row=row + 1, column=column + 1)
if __name__ == '__main__':
main.mainloop()
順便說一句:如果你想在行/列之間留出空間或改變按鈕的大小,你可以在每次調用grid()
時使用padx
、 pady
、 ipadx
和ipady
args 來實現 - 這些將設置外部 x/ y 填充(小部件周圍的空間)和內部 x/y 填充(小部件內部的空間)
簡單的答案是使用循環來做到這一點。 x 和 y 值似乎呈線性增加,因此可以通過以下方式縮短代碼:
from tkinter import *
def btnClickFunction():
print('clicked')
main = Tk()
main.geometry('745x435')
main.title('m')
#loop for placing all buttons
for i in range(80, 231, 25):
for j in range(110, 291, 30):
Button(main, text='O', command=btnClickFunction).place(x=i, y=j)
#loop for placing all vertical labels
for j in range(110, 291, 30):
Label(main, text=str((j-110)//30+1)).place(x=50, y=j)
#loop for placing all horizontal labels
for i in range(80, 231, 25):
Label(main, text=str((i-80)//25+1)).place(x=i, y=80)
main.mainloop()
使用循環執行此操作允許僅通過更改循環參數來縮放按鈕矩陣的大小。 為了生成 label 文本,使用了一個簡單的數學方程式來計算循環次數加 1。為了進一步改進此代碼,可以將 x 和 y 的范圍存儲在變量中,這樣增加矩陣的大小就意味着簡單改變變量值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.