首页 > 其他分享 >5.22

5.22

时间:2024-06-19 15:14:58浏览次数:7  
标签:canvas content oval range 5.22 fun row

完成 Python0021】电子算盘 分数 10 作者 doublebest 单位 石家庄铁道大学

【题目描述】设计一个电子算盘。要求绘制电子算盘界面,设计并实现打珠算过程(界面参考如下图示)。

界面右侧要求以图形绘制的方式绘制自画像,注意不能是图像文件显示的形式。

 

图片1.png

# coding=gb2312

from tkinter import *

def initWindow():

rect = canvas.create_rectangle(25, 40, 450, 400, width=3) # 算盘边框

x0, y0, x1, y1 = 0, 0, 0, 0

for i in range(5): # 生成串算珠的线

   line_shu = canvas.create_line(70 + x0, 40 + y0, 70 + x1, 400 + y1, width=3)

   x0 += 80

   x1 += 80

line_fenge = canvas.create_line(25, 100, 450, 100, width=3) # 生成上下珠的分割线

x0, y0, x1, y1 = 0, 0, 0, 0

for i in range(5): # 生成5个上珠

   top_oval\[i\] = canvas.create_oval(40 + x0, 60 + y0, 100 + x1, 90 + y1, fill='orange', tags=f"top{i}")

   x0 += 80

   x1 += 80

x0, y0, x1, y1 = 0, 0, 0, 0

for i in range(4): # 生成4*5个下珠

   for j in range(5):

       below_oval\[i\]\[j\] = canvas.create_oval(40 + x0, 160 + y0, 100 + x1, 190 + y1, fill='yellow', tags=f"below{i}{j}")

       chushi\[i\]\[j\] = canvas.coords(below_oval\[i\]\[j\])

       x0 += 80

       x1 += 80

   x0 = 0

   x1 = 0

   y0 += 60

   y1 += 60

print(chushi)

num = [[0 for i in range(5)] for j in range(4)] # 五个下珠分别对应的数值

num2 = [0 for i in range(5)] # 五个上珠分别对应的数值

canvas.create_oval(750, 370, 470, 90, fill='yellow')

canvas.create_oval(500, 170, 560, 200, fill='black')

canvas.create_oval(650, 170, 710, 200, fill='black')

canvas.create_arc(500, 200, 700, 300, start=-150, extent=120, style=ARC, width=3)

def get_empty():

empty = [[0 for j in range(5)] for i in range(4)]

for i in range(4):

   for j in range(5):

       if canvas.coords(below_oval\[i\]\[j\]) != chushi\[i\]\[j\]:

           empty\[i\]\[j\] = 1

print(empty)

return empty

def bind():

def handler_adaptor(handler, fun, row, col):

   """事件处理函数的适配器,相当于中介,可以帮助tag_bind函数传递参数"""

   return lambda event, handler=handler, fun=fun, col=col, row=row: handler(event=event, fun=fun, row=row, col=col)

def handler_adaptor2(handler2, fun, row):

   """事件处理函数的适配器,相当于中介,可以帮助tag_bind函数传递参数"""

   return lambda event, handler2=handler2, fun=fun, row=row: handler2(event=event, fun=fun, row=row)

def handler(event, fun, row, col):

   """下珠上划"""

   content = fun       # 这个就是被点击的算珠id

   empty = get_empty()

   if row == 0:

       if float(canvas.coords(content)\[1\]) - 40 >= 100:

           canvas.move(content, 0, -40)

   else:

       if empty\[row - 1\]\[col\] == 1:

           if float(canvas.coords(content)\[1\]) - 40 >= 110 + 10 \* (row + 1):

               canvas.move(content, 0, -40)

def handler2(event, fun, row):

   """上珠上划"""

   content = fun       # 这个就是被点击的算珠id

   if float(canvas.coords(content)\[1\]) - 20 >= 40:

       canvas.move(content, 0, -20)

def handler3(event, fun, row, col):

   """下珠下划"""

   content = fun       # 这个就是被点击的算珠id

   empty = get_empty()

   if row == 3:

       if float(canvas.coords(content)\[1\]) + 40 <= 350:

           canvas.move(content, 0, 40)

   else:

       if empty\[row\]\[col\] == 1:

           canvas.move(content, 0, 40)

def handler4(event, fun, row):

   """上珠下划"""

   content = fun       # 这个就是被点击的算珠id

   if float(canvas.coords(content)\[1\]) + 20 <= 60:

       canvas.move(content, 0, 20)

for i in range(5):

   canvas.tag_bind(top_oval\[i\], "<Button-1>", handler_adaptor2(handler2, fun=top_oval\[i\], row=i))

   canvas.tag_bind(top_oval\[i\], "<Button-3>", handler_adaptor2(handler4, fun=top_oval\[i\], row=i))

for i in range(4):

   for j in range(5):

       canvas.tag_bind(below_oval\[i\]\[j\], "<Button-1>", handler_adaptor(handler, fun=below_oval\[i\]\[j\], row=i, col=j))

       canvas.tag_bind(below_oval\[i\]\[j\], "<Button-3>", handler_adaptor(handler3, fun=below_oval\[i\]\[j\], row=i, col=j))

if _name_ == "_main_":

window = Tk()

window.title("电子算盘")

window.geometry("800x500")

canvas = Canvas(window, width="800", height="500", bg="white")

canvas.pack()

top_oval = [int for i in range(5)] # 定义列表存储5个上珠

below_oval = [[int for i in range(5)] for i in range(4)] # 定义列表存储4*5个下珠

chushi = [[0 for j in range(5)] for i in range(4)] # 所有下珠的初始坐标

initWindow()

bind()

window.mainloop()

 

标签:canvas,content,oval,range,5.22,fun,row
From: https://www.cnblogs.com/jais/p/18256268

相关文章

  • 5.22博客
    还是上午计网下午建民老师的课,晚上又是跑步,今天跑得慢了点但是足足有七公里学习内容:安卓packagecom.example.app_02.entity;publicclassRecord{  privateStringstartTime;  privateStringendTime;  privateStringrecord;  publicRecord(){......
  • 5.22
    今日总结学习时间2hpackagecom.example.yibaifen.Bean;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassMysql{publicstatic......
  • 5.22
    import'package:flutter/material.dart';import'package:dio/dio.dart';import'../Do/UserDao.dart';classColumnRecordsAppextendsStatelessWidget{@overrideWidgetbuild(BuildContextcontext){returnMaterialApp(ho......
  • 5.22
    继续与小组成员讨论如何完善每日心情的记录并且统计出来,根据不同的统计内容进行分析代码行量:166行学习所花时间:0.5h  packagecom.example.memosystem.activity;importandroid.os.AsyncTask;importandroid.os.Bundle;importandroid.widget.ArrayAdapter;importandroid.......
  • 5.22
    北京地铁作业packagecom.cxk.baseframe.project.systemmanage.controller;importjava.util.List;importjava.util.Map;importjavax.servlet.http.HttpServletResponse;importjavax.annotation.Resource;importcom.cxk.baseframe.config.common.annotation.Log;importcom.......
  • 2024.5.22(周三)
    function[x,val,k]=dampnm(fun,gfun,Hess,x0)%功能:用阻尼牛顿法求解无约束优化问题:minf(x)%输入:x0是初始点,fun,gfun,Hess分别是目标函数和梯度Hess阵函数%输出:x,val分别是近似最优解和近似最优值,k是迭代次数maxk=5000;rho=0.5;sigma=......
  • 5.22
    明天要进行二模。我也不知道为什么我要加密,那还是加上吧。想了下还是不加密了,总有人懒得看加密的闲话的,另一些人反而会好奇,真是奇怪呢。我想把搜狗输入法卸载了。领导集团问题昨天问题的翻版了属于是。只不过这是小根堆,需要在二分时该一下边界,最终找结果要改为\(\text{find(r......
  • 力扣1542 2024.5.22
    原题网址:此处为链接个人难度评价:1700分析:很惊讶会又在力扣看到区域赛的几乎原题。此题加上一个哈希就是区域赛题目了。回文其实你只需要关注奇偶性。那么你用前缀和,维护[0:i]区间内每个数的奇偶性,此时你可以发现[0:i]和[i:j]的前缀和异或之后,为0的位就说明[i:j]内此位为偶。(也......
  • 【2024.05.22】寄出的是相片,还是我的回忆?
    这段时间一直在朋友写信,太久没写信了曾经我总是觉得照片这种载体会被淘汰,应该会被视频所取代,现在看来不是的想给朋友们一个520惊喜,所以翻了下过去的照片在打印照片的时候却陷入了回忆之中去回想按下快门的那一刻,我是什么状态,那段时间在做什么想什么或许这就是最美好的感情吧,......
  • 5.22
    【Python0031】简易带参计算器设计一个简易的参数计算器。【输入格式】第一行输入待计算的带变量参数的计算式第二行输入各变量参数的赋值序列【输出格式】输出带变量参数的计算式的计算结果【输入样例】a+ba=1,b=10【输出样例】11代码caculate=input()num=input().split("......