Как превратить текст Python в кнопку в Python Turtle? - PullRequest
0 голосов
/ 09 июля 2019

Я хочу превратить слово «CAT» в кнопку, поэтому при нажатии на нее появляется надпись «CAT».Кроме того, кнопка, которую я хочу, должна быть в том положении, в котором слово находится прямо сейчас, когда это не кнопка.Нужна любая помощьСпасибо

Я уже попробовал модуль tkinter, но проблема в том, что он открывает отдельное окно с кнопкой.Мне нужна кнопка на главном экране.

import turtle
screen = turtle.Screen()

# this assures that the size of the screen will always be 400x400 ...
screen.setup(800,800)
turtle.ht()
turtle.penup()
turtle.goto (50, 200)
turtle.color("black")
turtle.write("CAT", move=False, align="center", font=("Times New Roman", 120, "bold"))
screen.bgpic("background.gif")
turtle.st()
turtle.forward(145)
turtle.left(90)
turtle.forward(10)
turtle.pendown()
turtle.forward(110)
turtle.left(90)
turtle.forward(287)
turtle.left(90)
turtle.forward(110)
turtle.left(90)
turtle.forward(287)
turtle.ht()

Я ожидаю, что на выходе будет огромная кнопка (черного цвета) в верхней части экрана с надписью «CAT».Когда эта кнопка нажата, я хочу, чтобы она сказала вслух «CAT».Прямо сейчас есть только текст наверху, говорящий "CAT".Я хочу заменить этот текст кнопкой, говорящей то же самое.Если я использую щелчок на экране, я хочу, чтобы щелчок был в определенных координатах.Как бы я это сделал.Благодарю вас!

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Мы могли бы воспользоваться объектно-ориентированной природой черепахи, чтобы определить наш собственный класс многократно используемых кнопок для генерации нескольких кнопок:

from turtle import Screen, Turtle

class Button(Turtle):
    FONT_NAME, FONT_SIZE, FONT_TYPE = 'Arial', 18, 'normal'

    HORIZONTAL_PAD, VERTICAL_PAD = 1.05, 1.15

    def __init__(self, text, position, command=None):
        super().__init__(visible=False)
        self.speed('fastest')
        self.penup()

        self.text = text
        self.position = position
        self.command = command

        self.width, self.height = self.drawButton()

    def drawButton(self):
        x, y = self.position
        self.setposition(x, y - self.FONT_SIZE/2)
        button_font = (self.FONT_NAME, self.FONT_SIZE, self.FONT_TYPE)
        self.write(self.text, align='center', move=True, font=button_font)

        width = 2 * (self.xcor() - x) * self.HORIZONTAL_PAD
        height = self.FONT_SIZE * self.VERTICAL_PAD

        self.setposition(x - width/2, y - height/2)
        self.pendown()

        for _ in range(2):
            self.forward(width)
            self.left(90)
            self.forward(height)
            self.left(90)

        self.penup()

        return width, height

    def clickButton(self, x, y):
        c_x, c_y = self.position
        half_w, half_h = self.width/2, self.height/2

        if c_x - half_w < x < c_x + half_w and c_y - half_h < y < c_y + half_h:
            (self.command)(x, y)

screen = Screen()

cyan = Button("Cyan Background", (100, 100), lambda x, y: screen.bgcolor('cyan'))

screen.onclick(cyan.clickButton, add=True)

yellow = Button("Yellow Background", (-100, -100), lambda x, y: screen.bgcolor('yellow'))

screen.onclick(yellow.clickButton, add=True)

screen.mainloop()

Украсьте, как считаете нужным.

0 голосов
/ 10 июля 2019

Вы можете использовать turtle do draw rectangle which could look like button. And you can use onscreenclick (check_button) to run function check_button` при нажатии на экран.Если вы нажмете в прямоугольнике, он может запустить функцию, которая что-то сделает.

import turtle

def show_cat():
    turtle.ht()
    turtle.penup()
    turtle.goto (15, 220)
    turtle.color("black")
    turtle.write("CAT", move=False, align="center", font=("Times New Roman", 120, "bold"))

def check_button(x, y):
    if -300 < x < 300 and 200 < y < 400:
        show_cat()

screen = turtle.Screen()
screen.setup(800,800)

turtle.penup()
turtle.goto(-300, 200)
turtle.pendown()
turtle.begin_fill()
turtle.fillcolor('red')
turtle.fd(600)
turtle.left(90)
turtle.fd(300)
turtle.left(90)
turtle.fd(600)
turtle.left(90)
turtle.fd(300)
turtle.left(90)
turtle.end_fill()

turtle.onscreenclick(check_button)

turtle.mainloop()

Или вы можете использовать tk.Button с canvas.master в качестве родителя и поместить его на холст, используя create_window(x, y, window=widget)

import turtle
import tkinter as tk

def show_cat():
    turtle.ht()
    turtle.penup()
    turtle.goto (15, 220)
    turtle.color("black")
    turtle.write("CAT", move=False, align="center", font=("Times New Roman", 120, "bold"))

screen = turtle.Screen()
screen.setup(800,800)

canvas = screen.getcanvas()

button = tk.Button(canvas.master, text="Click Me", command=show_cat)
canvas.create_window(0, 0, window=button)

#canvas.create_rectangle((100, 100, 700, 300))

turtle.mainloop()

Так же, как вы можете поместить другие виджеты tkinter на холст

РЕДАКТИРОВАТЬ: пример с большим количеством виджетов

import turtle
import tkinter as tk

def show_cat():
    label = tk.Label(canvas.master, text="Cat", font=("Times New Roman", 120, "bold"))
    canvas.create_window(0, -300, window=label)

    canvas.create_text(0, 300, text="HELLO", fill="red", font=("Times New Roman", 120, "bold"))

#-------------------------------------------

screen = turtle.Screen()
screen.setup(800,800)

canvas = screen.getcanvas()

button = tk.Button(canvas.master, text="Click Me", command=show_cat)
canvas.create_window(0, 0, window=button)

turtle.mainloop()
...