如何使用 Tkinter 按钮运行 Python 脚本?

Posted

技术标签:

【中文标题】如何使用 Tkinter 按钮运行 Python 脚本?【英文标题】:How do I use a Tkinter button to run a Python script? 【发布时间】:2018-01-28 10:20:24 【问题描述】:

我终于完成了一个我一直在做的掷骰子程序,我想添加最后一件事:我想添加一个按钮,上面写着“掷骰子”。有没有办法用 Tkinter 按钮运行 Python 脚本?我试过用:

from tkinter import *

master = Tk()

def callback():
CODE HERE

b = Button(master, text="BUTTON TEXT", command=callback)
b.pack()

mainloop()

但是当我使用它时,pygame 窗口只是黑色的。

我的程序的代码是:

exec(open("Dice Crop.py").read(), globals())
from pygame.locals import *
from random import randint
from tkinter import *
import pygame
import sys

pygame.init()

font = pygame.font.SysFont("comicsansms",30)

screen = pygame.display.set_mode((284,177),0,32)

background = pygame.image.load("background.jpg").convert()

one = pygame.image.load("one.png").convert_alpha()
two = pygame.image.load("two.png").convert_alpha()
three = pygame.image.load("three.png").convert_alpha()
four = pygame.image.load("four.png").convert_alpha()
five = pygame.image.load("five.png").convert_alpha()
six = pygame.image.load("six.png").convert_alpha()

counter = 0

while True:
    for evt in pygame.event.get():
        if evt.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.blit(background,(0, 0))

    if counter < 20:
        n = randint(1,6)
        counter += 1

    if n == 1:
        screen.blit(one,(100,50))
        screen.blit(font.render("1",True,(0,200,0)),(125,130))
    if n == 2:
        screen.blit(two,(100,50))
        screen.blit(font.render("2",True,(0,200,0)),(125,130))
    if n == 3:
        screen.blit(three,(100,50))
        screen.blit(font.render("3",True,(0,200,0)),(125,130))
    if n == 4:
        screen.blit(four,(100,50))
        screen.blit(font.render("4",True,(0,200,0)),(125,130))
    if n == 5:
        screen.blit(five,(100,50))
        screen.blit(font.render("5",True,(0,200,0)),(125,130))
    if n == 6:
        screen.blit(six,(100,50))
        screen.blit(font.render("6",True,(0,200,0)),(125,130))
    if counter < 20:
        print(n)
    if counter == 20:
        print(">",n,"<")


    pygame.time.delay(100)
    pygame.display.update()

exec(open("Dice Crop.py").read(), globals()) 所做的只是打开一个 Python 脚本,该脚本使用多个骰子获取一张图像并将其分割成单独的图像。)

【问题讨论】:

借助pygame.Rect 及其碰撞检测方法,您可以在pygame 中轻松创建一个非常简单的按钮。你不需要 tkinter。您必须执行另一个 Python 脚本也很奇怪。 pygame 也可以对图像进行切片,如果你想在另一个文件中进行,那么你应该导入切片的图像而不是执行文件。 我已经用pygame.Rect 发布了一个解决方案,但我会看看这是否也可以通过 tkinter 实现。但是,我不知道 pygame 和 tkinter 协同工作的效果如何。 Here's an answer 向您展示了如何将 pygame 显示嵌入到 tkinter.Frame 中,但它看起来有点奇怪,我宁愿使用其中一个用于 pygame 的 GUI 库(如 SGC ) 或只是一个矩形。 【参考方案1】:

您可以只使用pygame.Rect 作为按钮。矩形有一个collidepoint 方法,当用户单击鼠标按钮时,您可以将鼠标位置传递给该方法。鼠标事件有一个pos 属性,您可以将其传递给collidepoint,或者调用pygame.mouse.get_pos()

from random import randint
import pygame
import sys

pygame.init()

font = pygame.font.SysFont("comicsansms", 30)
screen = pygame.display.set_mode((284, 177), 0, 32)

one = font.render("1", True, (0,200,0))
two = font.render("2", True, (0,200,0))
three = font.render("3", True, (0,200,0))
four = font.render("4", True, (0,200,0))
five = font.render("5", True, (0,200,0))
six = font.render("6", True, (0,200,0))
# Put the images into a list or dictionary to
# avoid the repetition in the while loop.
dice = [one, two, three, four, five, six]

button = pygame.Rect(5, 5, 120, 40)
button_text = font.render("roll dice", True, (0,200,0))
rolling = False
counter = 0
n = 0

while True:
    for evt in pygame.event.get():
        if evt.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif evt.type == pygame.MOUSEBUTTONDOWN:
            # Check if the mouse clicked on the button.
            if button.collidepoint(evt.pos):
                # Start rolling and reset the counter.
                rolling = True
                counter = 0

    if rolling:
        if counter < 20:
            n = randint(1,6)
            counter += 1
            print(n)
        elif counter == 20:
            rolling = False
            print(">",n,"<")

    screen.fill((30, 30, 30))
    pygame.draw.rect(screen, (70, 80, 90), button)
    screen.blit(button_text, (button.x+3, button.y-2))
    # Blit the current image (index [n-1] of the list).
    screen.blit(dice[n-1],(100,50))

    pygame.time.delay(100)
    pygame.display.update()

【讨论】:

以上是关于如何使用 Tkinter 按钮运行 Python 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不单击tkinter python的情况下读取单选按钮值

如何使用 tkinter 按钮在 python 中写入文件?

你如何使用tkinter按钮重启python程序?

Python里tkinter如何重置单选按钮?

Python / Tkinter:使用按钮更新类变量

如何使用 Python 3.8 中的按钮读取 Tkinter 中的条目